twittering-mode-3.1.0/twittering-mode.el0000664000175000017500000161427712772521564020154 0ustar tadashitadashi;;; twittering-mode.el --- Major mode for Twitter ;; Copyright (C) 2009-2015 Tadashi MATSUO ;; 2007, 2009-2011 Yuto Hayamizu. ;; 2008 Tsuyoshi CHO ;; 2014, 2015 Xavier Maillard ;; Author: Tadashi MATSUO ;; Y. Hayamizu ;; Tsuyoshi CHO ;; Alberto Garcia ;; Xavier Maillard ;; Created: Sep 4, 2007 ;; Version: 3.1.0 ;; Identity: $Id$ ;; Keywords: twitter web ;; URL: http://twmode.sf.net/ ;; This file is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; This file is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to ;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. ;;; Commentary: ;; twittering-mode.el is a major mode for Twitter. ;; You can check friends timeline, and update your status on Emacs. ;;; Feature Request: ;; URL : http://twitter.com/d00dle/statuses/577876082 ;; * Status Input from Popup buffer and C-cC-c to POST. ;; URL : http://code.nanigac.com/source/view/419 ;; * update status for region ;;; Code: (eval-when-compile (require 'cl) (require 'easymenu)) (require 'xml) (eval-and-compile ;; On byte-compilation, Emacs21 requires loading the libraries ;; distributed with twittering-mode.el for macros defined in them. (when (> 22 emacs-major-version) (setq load-path (append (mapcar (lambda (dir) (expand-file-name dir (if load-file-name (or (file-name-directory load-file-name) ".") "."))) '("url-emacs21" "emacs21")) load-path)))) (when (> 22 emacs-major-version) (and (require 'un-define nil t) ;; the explicitly require 'unicode to update a workaround with ;; navi2ch. see a comment of `twittering-ucs-to-char' for more ;; details. (require 'unicode nil t)) (defadvice url-scheme-register-proxy (around twittering-fix-process-env (scheme) activate) (let ((process-environment (apply 'append (let ((env-var (concat scheme "_proxy"))) (mapcar (lambda (str) (if (string-match (concat "^\\(" (regexp-opt (list (upcase env-var) (downcase env-var))) "\\)=$") str) nil (list str))) process-environment))))) ad-do-it))) (require 'url) (defgroup twittering-mode nil "Settings for twittering-mode." :link '(url-link "https://github.com/hayamiz/twittering-mode") :prefix "twittering-" :group 'hypermedia) (defconst twittering-mode-version "3.1.0") (defconst twittering-mode-identity "$Id$") (defvar twittering-api-host "api.twitter.com") (defvar twittering-api-search-host "search.twitter.com") (defvar twittering-web-host "twitter.com") (defvar twittering-oauth-request-token-url-without-scheme "://api.twitter.com/oauth/request_token") (defvar twittering-oauth-authorization-url-base-without-scheme "://api.twitter.com/oauth/authorize?oauth_token=") (defvar twittering-oauth-access-token-url-without-scheme "://api.twitter.com/oauth/access_token") (defun twittering-mode-version () "Display a message for twittering-mode version." (interactive) (let ((version-string (format "twittering-mode-v%s" twittering-mode-version))) (if (interactive-p) (message "%s" version-string) version-string))) (defcustom twittering-auth-method 'oauth "*Authentication method to use with `twittering-mode'. Choose between symbols `oauth' (default), `basic' or `xauth'. OAuth Authentication requires `twittering-oauth-consumer-key' and `twittering-oauth-consumer-secret'. Additionally, it requires an external command `curl' or another command included in `tls-program', which may be `openssl' or `gnutls-cli', for SSL." :group 'twittering-mode :type '(choice :tag "Twitter authentication method" (const :tag "Basic authentication" :value basic) (const :tag "OAuth authentication" :value oauth) (const :tag "xAuth authentication" :value xauth))) (defvar twittering-account-authorization nil "State of account authorization for `twittering-username' and `twittering-password'. The value is one of the following symbols: nil -- The account have not been authorized yet. queried -- The authorization has been queried, but not finished yet. authorized -- The account has been authorized.") (defcustom twittering-oauth-use-ssl t "*If non-nil, use SSL authentication for OAuth. Twitter requires SSL on authorization via OAuth." :group 'twittering-mode :type 'boolean) (defcustom twittering-oauth-invoke-browser nil "*If non-nil, invoke a browser on authorization of access key automatically." :type 'boolean :group 'twittering-mode) (defvar twittering-oauth-consumer-key nil) (defvar twittering-oauth-consumer-secret nil) (defvar twittering-oauth-access-token-alist nil) (defconst twittering-max-number-of-tweets-on-retrieval 200 "The maximum number of `twittering-number-of-tweets-on-retrieval'.") (defcustom twittering-number-of-tweets-on-retrieval 20 "*Number of tweets which will be retrieved in one request. The upper limit is `twittering-max-number-of-tweets-on-retrieval'." :type 'integer :group 'twittering-mode) (defcustom twittering-tinyurl-service 'tinyurl "*Shorten URI service to use. This must be one of key symbols of `twittering-tinyurl-services-map'. To use bit.ly or j.mp services, you have to configure `twittering-bitly-login' and `twittering-bitly-api-key'." :type '(radio (symbol :tag "bit.ly" :value bit.ly) (symbol :tag "goo.gl" :value goo.gl) (symbol :tag "is.gd" :value is.gd) (symbol :tag "j.mp" :value j.mp) (symbol :tag "migre.me" :value migre.me) (symbol :tag "tinyurl" :value tinyurl) (symbol :tag "toly" :value toly)) :group 'twittering-mode) (defcustom twittering-tinyurl-services-map '((bit.ly twittering-make-http-request-for-bitly (lambda (service reply) (if (string-match "\n\\'" reply) (substring reply 0 (match-beginning 0)) reply))) (goo.gl (lambda (service longurl) (twittering-make-http-request-from-uri "POST" '(("Content-Type" . "application/json")) "https://www.googleapis.com/urlshortener/v1/url" (concat "{\"longUrl\": \"" longurl "\"}"))) (lambda (service reply) (when (string-match "\"id\"[[:space:]]*:[[:space:]]*\"\\([^\"]*\\)\"" reply) (match-string 1 reply)))) (is.gd . "http://is.gd/create.php?format=simple&url=") (j.mp twittering-make-http-request-for-bitly (lambda (service reply) (if (string-match "\n\\'" reply) (substring reply 0 (match-beginning 0)) reply))) (migre.me . "http://migre.me/api.txt?url=") (tinyurl . "http://tinyurl.com/api-create.php?url=") (toly (lambda (service longurl) (twittering-make-http-request-from-uri "POST" nil "http://to.ly/api.php" (concat "longurl=" (twittering-percent-encode longurl)))))) "Alist of URL shortening services. The key is a symbol specifying the service. The value is a string or a list consisting of two elements at most. If the value is a string, `(concat THE-FIRST-ELEMENT longurl)' is used as the URL invoking the service. If the value is a list, it is interpreted as follows. The first element specifies how to make a HTTP request for shortening a URL. If the first element is a string, `(concat THE-FIRST-ELEMENT longurl)' is used as the URL invoking the service. If the first element is a function, it is called as `(funcall THE-FIRST-ELEMENT service-symbol longurl)' to obtain a HTTP request alist for invoking the service, which must be generated by `twittering-make-http-request'. The second element specifies how to post-process a HTTP reply by the HTTP request. If the second element is nil, the reply is directly used as a shortened URL. If the second element is a function, it is called as `(funcall THE-SECOND-ELEMENT service-symbol HTTP-reply-string)' and its result is used as a shortened URL." :type 'alist :group 'twittering-mode) (defcustom twittering-bitly-login nil "*The login name for URL shortening service bit.ly and j.mp." :type '(choice (const nil) string) :group 'twittering-mode) (defcustom twittering-bitly-api-key nil "*API key for `bit.ly' and `j.mp' URL shortening services." :type '(choice (const nil) string) :group 'twittering-mode) (defvar twittering-mode-map (make-sparse-keymap)) (defvar twittering-mode-menu-on-uri-map (make-sparse-keymap "Twittering Mode")) (defvar twittering-mode-on-uri-map (make-sparse-keymap)) (defvar twittering-tweet-history nil) (defvar twittering-user-history nil) (defvar twittering-timeline-history nil) (defvar twittering-hashtag-history nil) (defvar twittering-search-history nil) (defvar twittering-current-hashtag nil "A hash tag string currently set. You can set it by calling `twittering-set-current-hashtag'.") (defvar twittering-timer nil "Timer object for timeline refreshing will be stored here. DO NOT SET VALUE MANUALLY.") (defcustom twittering-timer-interval 90 "Number of seconds to wait before an auto-reload occurs. Number of API calls per hour is limited so this value should be 60 or more." :type 'integer :group 'twittering-mode) (defvar twittering-timer-for-redisplaying nil "Timer object for timeline redisplay statuses will be stored here. DO NOT SET VALUE MANUALLY.") (defvar twittering-timer-interval-for-redisplaying 5.0 "The interval of auto redisplaying statuses. Each time Emacs remains idle for the interval, twittering-mode updates parts requiring to be redrawn.") (defcustom twittering-username nil "*A username of your Twitter account." :type '(choice (const nil) string) :group 'twittering-mode) (defcustom twittering-password nil "*A password of your Twitter account. Leave it blank is the recommended way because writing a password in .emacs file is so dangerous." :type '(choice (const nil) string) :group 'twittering-mode) (defcustom twittering-initial-timeline-spec-string ":home" "*An initial timeline spec string or a list of timeline spec strings. This specifies one or more initial timeline spec strings, which are automatically visited when invoking `twittering-mode' or `twit'. If it is a string, it specifies a timeline spec string. If it is a list of strings, it specifies multiple timeline spec strings." :type '(choice (const nil) string) :group 'twittering-mode) (defvar twittering-timeline-spec nil "The timeline spec for the current buffer.") (defvar twittering-timeline-spec-string "" "The timeline spec string for the current buffer.") (defcustom twittering-timeline-spec-alias nil "*Alist for aliases of timeline spec. Each element is (NAME . SPEC-STRING), where NAME is a string and SPEC-STRING is a string or a function that returns a timeline spec string. The alias can be referred as \"$NAME\" or \"$NAME(ARG)\" in timeline spec string. If SPEC-STRING is a string, ARG is simply ignored. If SPEC-STRING is a function, it is called with a string argument. For the style \"$NAME\", the function is called with nil. For the style \"$NAME(ARG)\", the function is called with a string ARG. For example, if you specify `((\"FRIENDS\" . \"my-account/friends-list\") (\"related-to\" . ,(lambda (username) (if username (format \":search/to:%s OR from:%s OR @%s/\" username username username) \":home\")))), then you can use \"$FRIENDS\" and \"$related-to(USER)\" as \"my-account/friends-list\" and \":search/to:USER OR from:USER OR @USER/\", respectively." :type 'alist :group 'twittering-mode) (defvar twittering-current-timeline-spec-string nil "The current timeline spec string. This variable should not be referred directly. Use `twittering-current-timeline-spec-string' or `twittering-current-timeline-spec'.") (defvar twittering-list-index-retrieved nil) (defvar twittering-process-info-alist nil "Alist of active process and timeline spec retrieved by the process.") (defvar twittering-server-info-alist nil "Alist of server information.") (defvar twittering-api-limit-info-alist '() "Alist of an API identifier and an alist representing rate limit for the API.") (defvar twittering-timeline-spec-to-api-table '() "Alist of a timeline spec and an API identifier for retrieving the timeline.") (defcustom twittering-mode-init-hook nil "*Hook run after initializing global variables for `twittering-mode'." :type 'hook :group 'twittering-mode) (defcustom twittering-mode-hook nil "*Hook run every time a buffer is initialized as a `twittering-mode' buffer." :type 'hook :group 'twittering-mode) (defvar twittering-cookie-alist nil "Alist for stroing cookies for each account. This variable stores an alist. A key of the alist is a string that is a screen name of an account. A value of the alist is a cookie alist which corresponds to a list of a pair of a cookie name and value.") (defvar twittering-new-tweets-count 0 "Number of new tweets when `twittering-new-tweets-hook' is run.") (defvar twittering-new-tweets-spec nil "Timeline spec, which new tweets belong to, when `twittering-new-tweets-hook' is run.") (defvar twittering-new-tweets-statuses nil "New tweet status messages, when `twittering-new-tweets-hook' is run.") (defcustom twittering-new-tweets-hook nil "*Hook run when new tweets are received. You can read `twittering-new-tweets-count' or `twittering-new-tweets-spec' to get the number of new tweets received when this hook is run." :type 'hook :group 'twittering-mode) (defvar twittering-rendered-new-tweets-spec nil "A timeline spec of newly rendered tweets. This variable is bound when invoking hooks registered with `twittering-new-tweets-rendered-hook'.") (defvar twittering-rendered-new-tweets-spec-string nil "A timeline spec string of newly rendered tweets. This variable is bound when invoking hooks registered with `twittering-new-tweets-rendered-hook'.") (defvar twittering-rendered-new-tweets nil "A list of newly rendered tweets. Hooks registered with `twittering-new-tweets-rendered-hook' can use this variable as a list of rendered tweets. Each tweet is represented as an alist. You can refer to a property of a tweet alist as (cdr (assq PROPERTY-SYMBOL TWEET-ALIST)). Valid symbols are following; id, text, user-name, user-screen-name, user-id, source, source-uri. In the list, tweets are placed in order of time. The car of the list is the latest one, and the last is the oldest one.") (defcustom twittering-new-tweets-rendered-hook nil "*Hook run when new tweets are rendered. When the registered functions are called, the current buffer is the buffer that the new tweets are just rendered on. The functions can refer to the timeline spec and timeline spec string as `twittering-rendered-new-tweets-spec' and `twittering-rendered-new-tweets-spec-string', repectively. Hooks can also use the local variable `twittering-rendered-new-tweets' as a list of rendered tweets. For the detail of the representation of tweets, see the variable `twittering-rendered-new-tweets'." :type 'hook :group 'twittering-mode) (defvar twittering-active-mode nil "Non-nil if new statuses should be retrieved periodically. Do not modify this variable directly. Use `twittering-activate-buffer', `twittering-deactivate-buffer', `twittering-toggle-activate-buffer' or `twittering-set-active-flag-for-buffer'.") (defvar twittering-jojo-mode nil) (defcustom twittering-reverse-mode nil "*Non-nil means tweets are aligned in reverse order of `http://twitter.com/'." :type 'boolean :group 'twittering-mode) (defcustom twittering-display-remaining nil "*If non-nil, display remaining of rate limit on the mode-line." :type 'boolean :group 'twittering-mode) (defcustom twittering-display-connection-method t "*If non-nil, display the current connection method on the mode-line." :type 'boolean :group 'twittering-mode) (defcustom twittering-status-format "%RT{%FACE[bold]{RT}}%i %s, %@:\n%FOLD[ ]{%T // from %f%L%r%R%QT{\n+----\n%FOLD[|]{%i %s, %@:\n%FOLD[ ]{%T // from %f%L%r%R}}\n+----}}\n " "Format string for rendering statuses. Ex. \"%i %s, %@:\\n%FILL{ %T // from %f%L%r%R}\n \" Items: %s - screen_name %S - name %i - profile_image %d - description %l - location %L - \" [location]\" %r - \" sent to user\" (use on direct_messages{,_sent}) %r - \" in reply to user\" (use on other standard timeline) %R - \" (retweeted by user)\" %RT{...} - strings rendered only when the tweet is a retweet. The braced strings are rendered with the information of the retweet itself instead of that of the retweeted original tweet. For example, %s for a retweet means who posted the original tweet, but %RT{%s} means who retweeted it. %QT{...} - strings rendered only when the tweet quotes a tweet. The braced strings are rendered with the information of the quoted tweet. For example, %QT{%s} means the author of the quoted tweet. %u - url %j - user.id %p - protected? %c - created_at (raw UTC string) %C{time-format-str} - created_at (formatted with time-format-str) %@{time-format-str} - X seconds ago (formatted with time-format-str) %T - raw text %t - text filled as one paragraph %' - truncated %FACE[face-name]{...} - strings decorated with the specified face. %FIELD[format-str]{field-name} - a value of the given field of a tweet formatted with format-str. The format-str is optional. As a field-name, you can use \"retweet_count\", \"favorite_count\" and so on. %FIELD-IF-NONZERO[format-str]{field-name} - similar to %FIELD[...]{...} except that this makes an empty string if the field value is zero. %FILL[prefix]{...} - strings filled as a paragraph. The prefix is optional. You can use any other specifiers in braces. %FOLD[prefix]{...} - strings folded within the frame width. The prefix is optional. This keeps newlines and does not squeeze a series of white spaces. You can use any other specifiers in braces. %f - source %# - id" :type 'string :group 'twittering-mode) (defcustom twittering-retweet-format '(nil _ " RT: %t (via @%s)") "*A format string or a skeleton for retweet. If the value is a string, it means a format string for generating an initial string of a retweet. The format string is converted with the below replacement table. And then, the cursor is placed on the next of the initial string. It is equivalent to the skeleton '(nil STRING _). Note that this string is inserted before the edit skeleton specified by `twittering-edit-skeleton' is performed. If the value is a list, it is treated as a skeleton used with `skeleton-insert'. The strings included in the list are converted with the following replacement table. And then, the list with converted strings is inserted by `skeleton-insert'. Note that this skeleton is performed before the edit skeleton specified by `twittering-edit-skeleton' is performed. Replacement table: %s - The screen-name of the cited tweet. %t - The text of the cited tweet. %u - The URL of the cited tweet. %# - The ID of the cited tweet. %% - % itself." :type 'sexp :group 'twittering-mode) (defcustom twittering-fill-column nil "*The `fill-column' used for \"%FILL{...}\" in `twittering-status-format'. If nil, the fill-column is automatically calculated." :type '(choice (const nil) integer) :group 'twittering-mode) (defcustom twittering-show-replied-tweets t "*The number of replied tweets which will be showed in one tweet. If the value is not a number and is non-nil, show all replied tweets which is already fetched. If the value is nil, doesn't show replied tweets." :type '(choice (const :tag "Do not show replied tweets" :value nil) (const :tag "Show all replied tweets" :value t) (integer :tag "Number of replied tweet")) :group 'twittering-mode) (defcustom twittering-default-show-replied-tweets nil "*The number of default replied tweets which will be shown in one tweet. This value will be used only when showing new tweets. See `twittering-show-replied-tweets' for more details." :type '(choice (const nil) integer) :group 'twittering-mode) (defcustom twittering-disable-overlay-on-too-long-string nil "*If non-nil, disable overlay on too long string on edit buffer. If nil, `twittering-edit-mode' puts an overlay `twittering-warning-overlay' on characters exceeding the maximum length. On some environments, some input methods seem to interfere the update of the overlay. In such case, you may avoid the problems by setting this variable to non-nil." :type 'boolean :group 'twittering-mode) (defcustom twittering-use-show-minibuffer-length t "*Show current length of minibuffer if this variable is non-nil. We suggest that you should set to nil to disable the showing function when it conflict with your input method (such as AquaSKK, etc.)" :type 'boolean :group 'twittering-mode) (defvar twittering-notify-successful-http-get t) (defcustom twittering-use-ssl t "*Use SSL connection if this variable is non-nil. SSL connections use an external command as a backend." :type 'boolean :group 'twittering-mode) (defcustom twittering-allow-insecure-server-cert nil "*If non-nil, `twittering-mode' allows insecure server certificates." :type 'boolean :group 'twittering-mode) (defvar twittering-curl-program nil "Cache a result of `twittering-find-curl-program'. DO NOT SET VALUE MANUALLY.") (defvar twittering-curl-program-https-capability nil "Cache a result of `twittering-start-http-session-curl-https-p'. DO NOT SET VALUE MANUALLY.") (defvar twittering-curl-program-http2-capability nil "Cache a result of `twittering-start-http-session-curl-http2-p'. DO NOT SET VALUE MANUALLY.") (defvar twittering-wget-program nil "Cache a result of `twittering-find-wget-program'. DO NOT SET VALUE MANUALLY.") (defcustom twittering-tls-program nil "*List of strings containing commands to start TLS stream to a host. Each entry in the list is tried until a connection is successful. %h is replaced with server hostname, %p with port to connect to. Also see `tls-program'. If nil, this is initialized with a list of valied entries extracted from `tls-program'." :type '(repeat string) :group 'twittering-mode) (defcustom twittering-connection-type-order '(curl wget urllib-http native urllib-https) "*A list of connection methods in the preferred order." :type 'list :group 'twittering-mode) (defun twittering-connection-build-customize-option () "Generate a valid `defcustom' entry to build `twittering-connection-type-table' variable." (list 'repeat (list 'cons :tag "Connection" '(symbol :tag "Name" :value "") '(repeat :tag "Connection method definition" (choice (cons :tag "Check test method" (const :format "" check) (choice :value t (const :tag "Do not check" t) (function :tag "Check function"))) (cons :tag "Display name" (const :format "" display-name) string) (cons :tag "HTTPS connection method" (const :format "" https) (choice :value nil (const :tag "None" nil) (const :tag "True" t) (function :tag "HTTPS test function"))) (cons :tag "Send HTTP request function" (const :format "" send-http-request) function) (cons :tag "Pre process buffer" (const :format "" pre-process-buffer) function)))))) (defcustom twittering-connection-type-table '((native (check . t) (send-http-request . twittering-send-http-request-native) (pre-process-buffer . twittering-pre-process-buffer-native)) (curl (check . twittering-start-http-session-curl-p) (https . twittering-start-http-session-curl-https-p) (send-http-request . twittering-send-http-request-curl) (pre-process-buffer . twittering-pre-process-buffer-curl)) (wget (check . twittering-start-http-session-wget-p) (https . ignore) (send-http-request . twittering-send-http-request-wget) (pre-process-buffer . twittering-pre-process-buffer-wget)) (urllib-http (display-name . "urllib") (check . twittering-start-http-session-urllib-p) (https . nil) (send-http-request . twittering-send-http-request-urllib) (pre-process-buffer . twittering-pre-process-buffer-urllib)) (urllib-https (display-name . "urllib") (check . twittering-start-http-session-urllib-p) (https . twittering-start-http-session-urllib-https-p) (send-http-request . twittering-send-http-request-urllib) (pre-process-buffer . twittering-pre-process-buffer-urllib))) "A list of alist of connection methods." :group 'twittering-mode :type (twittering-connection-build-customize-option)) (defvar twittering-format-status-function-source "" "The status format string that has generated the current `twittering-format-status-function'.") (defvar twittering-format-status-function nil "The formating function generated from `twittering-format-status-function-source'.") (defvar twittering-format-status-function-without-compile nil "The formating function generated from `twittering-format-status-function-source', which is a lambda expression without being compiled.") (defvar twittering-timeline-data-table (make-hash-table :test 'equal)) (defcustom twittering-username-face 'twittering-username-face "*Face used to display USERNAME." :type 'face :group 'twittering-mode) (defcustom twittering-uri-face 'twittering-uri-face "*Face used to display URIs." :type 'face :group 'twittering-mode) (defcustom twittering-use-native-retweet nil "*If non-nil, post retweet using native retweets." :type 'boolean :group 'twittering-mode) (defcustom twittering-update-status-function 'twittering-update-status-from-pop-up-buffer "*The function which is used to post a tweet. It takes the following 5 arguments, INIT-STR, REPLY-TO-ID, USERNAME, TWEET-TYPE and CURRENT-SPEC. The first argument INIT-STR is nil or an initial text to be edited. REPLY-TO-ID and USERNAME are an ID and a user-screen-name of a tweet to which you are going to reply. If the tweet is not a reply, they are nil. TWEET-TYPE is a symbol specifying a type of a tweet being edited. It must be one of 'direct-message, 'normal, 'organic-retweet and 'reply. CURRENT-SPEC means on which timeline the function is called. Twittering-mode provides two functions for updating status: * `twittering-update-status-from-minibuffer': edit tweets in minibuffer * `twittering-update-status-from-pop-up-buffer': edit tweets in pop-up buffer" :type '(choice (const :tag "built-in: from minibuffer" twittering-update-status-from-minibuffer) (const :tag "built-in: from a popup buffer" twittering-update-status-from-pop-up-buffer) (function :tag "Your own function")) :group 'twittering-mode) (defcustom twittering-request-confirmation-on-posting nil "*If non-nil, confirmation will be requested on posting a tweet edited in pop-up buffer." :type 'boolean :group 'twittering-mode) (defcustom twittering-use-master-password nil "*If non-nil, store private information encrypted with a master password." :type 'boolean :group 'twittering-mode) (defcustom twittering-private-info-file (expand-file-name "~/.twittering-mode.gpg") "*File for storing encrypted private information. Only used when `twittering-use-master-password' is non-nil." :group 'twittering-mode :type 'file) (defvar twittering-private-info-file-loaded nil "Whether the private info file has been loaded or not.") (defvar twittering-variables-stored-with-encryption '(twittering-oauth-access-token-alist)) (defvar twittering-api-prefix "1/") (defvar twittering-search-api-method "search") (defvar twittering-web-path-prefix "") (defconst twittering-service-method-table '((twitter (status-url . twittering-get-status-url-twitter) (search-url . twittering-get-search-url-twitter)) (twitter-api-v1.1 (status-url . twittering-get-status-url-twitter) (search-url . twittering-get-search-url-twitter)) (statusnet (status-url . twittering-get-status-url-statusnet) (search-url . twittering-get-search-url-statusnet))) "A list of alist of service methods.") (defcustom twittering-service-method 'twitter-api-v1.1 "*Service method for `twittering-mode'. The symbol `twitter' means Twitter Service. The symbol `statusnet' means StatusNet Service. Default to `twitter-api-v1.1' which is an alias for `twitter'. See also `twittering-service-method-table'." :type (if (> (length (mapcar #'car twittering-service-method-table)) 0) `(choice ,@(mapcar (lambda (entry) `(const ,(car entry))) twittering-service-method-table)) 'symbol) :group 'twittering-mode) (defcustom twittering-timeline-header-face 'twittering-timeline-header-face "*Face for the header on `twittering-mode'. The face is used for rendering `twittering-timeline-header'." :type 'face :group 'twittering-mode) (defcustom twittering-timeline-footer-face 'twittering-timeline-footer-face "*Face for the footer on `twittering-mode'. The face is used for rendering `twittering-timeline-footer'." :type 'face :group 'twittering-mode) (defcustom twittering-timeline-header "-- Press Enter here to update --\n" "*Timeline header string on `twittering-mode'. The string is rendered on the beginning of a `twittering-mode' buffer. Its face is specified by `twittering-timeline-header-face'." :type 'string :group 'twittering-mode) (defcustom twittering-timeline-footer "-- Press Enter here to update --" "*Timeline footer string on `twittering-mode'. The string is rendered on the end of a `twittering-mode' buffer. Its face is specified by `twittering-timeline-footer-face'." :type 'string :group 'twittering-mode) (defcustom twittering-pop-to-buffer-function 'twittering-pop-to-buffer-in-bottom-largest-window "*Function being invoked by `twittering-pop-to-buffer'. It will receive an argument, the buffer being selected. For example, the following functions can be used; `pop-to-buffer', `twittering-pop-to-buffer-simple', `twittering-pop-to-buffer-in-current-window', `twittering-pop-to-buffer-in-largest-window', and `twittering-pop-to-buffer-in-bottom-largest-window'." :type 'function :group 'twittering-mode) ;; FIXME: change to something better than alist (defcustom twittering-relative-retrieval-interval-alist '(("\\`:direct.*\\'" 4) (":home" ":mentions" 1) (t 1)) "*An alist of relative intervals of retrieving timelines. Each element looks like (TIMELINE-SPEC-REGEXP RELATIVE-INTERVAL). TIMELINE-SPEC-REGEXP must be t or a regexp string specifying primary timeline specs. If TIMELINE-SPEC-REGEXP is t, it matches all timelines. RELATIVE-INTERVAL must be zero or a positive integer specifying relative interval of retrieving timelines that match TIMELINE-SPEC-REGEXP. An interval for a timeline is determined as follows; 1. Find the first element where TIMELINE-SPEC-REGEXP matches the timeline or TIMELINE-SPEC-REGEXP is t. If no elements are found, the interval is `twittering-timer-interval'. 2. Check the RELATIVE-INTERVAL of the element. If RELATIVE-INTERVAL is a positive integer, the interval is RELATIVE-INTERVAL times as long as `twittering-timer-interval'. If RELATIVE-INTERVAL is zero, the interval is infinity. The timeline is not retrieved automatically." :type 'alist :group 'twittering-mode) (defvar twittering-relative-retrieval-count-alist '() "An alist for counting retrieval of primary timelines.") (defvar twittering-filter-alist '() "*An alist of hidden tweet patterns for each primary timeline. Each element looks like: (TIMELINE-SPECIFIER (SYM1 . REGEXP1) (SYM2 . REGEXP2) ...). TIMELINE-SPECIFIER must be a string or a list of strings. Each string is a regexp for specifying primary timelines. Note that you cannot specify composite timelines such as \":merge\", \":exclude-if\" or \":exclude-re\". Following regexps (REGEXP1, REGEXP2, ...) specify which tweet should be hidden in a certain timeline. In a timeline that matches TIMELINE-SPECIFIER, a tweet is hidden if its elements specified by SYM1, SYM2, ... match corresponding REGEXP1, REGEXP2, ... respectively. If a timeline matches multiple specifiers, all regexps of matched elements are effective. For example, if you specify '(((\":home\" \":mentions\") (text . \"http://\")) (\"^[^:]\" (text . \"sample\") (user-screen-name . \"\\`FOO\\'\")) (\"twitter/.*\" (text . \"^aa\"))), the following tweets are hidden. - tweets including \"http://\" in the home timeline and the mentions timeline, - tweets that are posted by the user FOO and include \"sample\" in user timelines and list timelines, - tweets including \"aa\" at a beginning of a line in list timelines of twitter, such as \"twitter/media\" or \"twitter/support\".") ;;;; ;;;; Macro and small utility function ;;;; (defun assocref (item alist) (cdr (assoc item alist))) (defmacro list-push (value listvar) `(setq ,listvar (cons ,value ,listvar))) (defmacro case-string (str &rest clauses) `(cond ,@(mapcar (lambda (clause) (let ((keylist (car clause)) (body (cdr clause))) `(,(if (listp keylist) `(or ,@(mapcar (lambda (key) `(string-equal ,str ,key)) keylist)) 't) ,@body))) clauses))) (defmacro twittering-wait-while (timeout interval condition &optional form &rest timeout-forms) "Wait while CONDITION returns non-nil until TIMEOUT seconds passes. The form CONDITION is repeatedly evaluated for every INTERVAL seconds until CONDITION returns nil or TIMEOUT seconds passes unless TIMEOUT is nil. If TIMEOUT is nil, there is no time limit. If CONDITION returns nil, evaluate the form FORM and return its value. If TIMEOUT seconds passes, evaluate the forms TIMEOUT-FORMS and return the value of the last form in TIMEOUT-FORMS." `(lexical-let (,@(when timeout `((timeout ,timeout))) (interval ,interval) (current 0.0)) (while (and ,@(when timeout '((< current timeout))) ,condition) (sleep-for interval) (setq current (+ current interval))) ,(when (or form timeout-forms) (if (null timeout) form `(if (< current timeout) ,form ,@timeout-forms))))) (defun twittering-extract-matched-substring-all (regexp str) (let ((pos 0) (result nil)) (while (string-match regexp str pos) (setq result (cons (match-string 1 str) result)) (setq pos (match-end 0))) (reverse result))) (defun twittering-process-alive-p (proc) "Return non-nil if PROC is alive." (not (memq (process-status proc) '(nil closed exit failed signal)))) (defun twittering-start-process-with-sentinel (name buffer program args sentinel) "Start a program in a subprocess with a sentinel. This function is the same as `start-process' except that SENTINEL must be invoked when the process is successfully started." (let ((proc (apply 'start-process name buffer program args))) (when (and proc (functionp sentinel)) (if (twittering-process-alive-p proc) (set-process-sentinel proc sentinel) ;; Ensure that the sentinel is invoked if a subprocess is ;; successfully started. (funcall sentinel proc "finished"))) proc)) (defun twittering-parse-time-string (str &optional round-up) "Parse the time-string STR into (SEC MIN HOUR DAY MON YEAR DOW DST TZ). This function is the same as `parse-time-string' except to complement the lacked parameters with the current time. If ROUND-UP is nil, complement the lacked parameters with the oldest ones. If ROUND-UP is non-nil, complement the lacked parameters with the latest ones. For example, (twittering-parse-time-string \"2012-04-20\") returns (0 0 0 20 4 2012 nil nil 32400). And (twittering-parse-time-string \"2012-04-20\" t) returns (59 59 23 20 4 2012 nil nil 32400). The values are identical to those of `decode-time', but any values that are unknown are returned as nil." (let* ((parsed (parse-time-string str)) (current (decode-time (current-time))) (replacement-alist `((SEC . ,(if round-up 59 0)) (MIN . ,(if round-up 59 0)) (HOUR . ,(if round-up 23 0)) (DAY . nil) (MON . nil) (YEAR . nil) (DOW . nil) (DST . nil) (TZ . nil))) (sym-list (mapcar 'car replacement-alist)) (result nil)) (while (and parsed current sym-list) (let* ((sym (car sym-list)) (v (or (car parsed) (cdr (assq sym replacement-alist)) ;; If `sym' is not 'DOW and it is bound to nil ;; in `replacement-alist', use `current'. (unless (eq sym 'DOW) (car current))))) (setq result (cons v result))) (setq parsed (cdr parsed)) (setq current (cdr current)) (setq sym-list (cdr sym-list))) (reverse result))) (defun twittering-normalize-string (str) (if (require 'ucs-normalize nil t) (ucs-normalize-NFC-string str) str)) ;;;; ;;;; Utility for portability ;;;; (defun twittering-remove-duplicates (list) "Return a copy of LIST with all duplicate elements removed. This is non-destructive version of `delete-dups' which is not defined in Emacs21." (if (fboundp 'delete-dups) (delete-dups (copy-sequence list)) (let ((rest list) (result nil)) (while rest (unless (member (car rest) result) (setq result (cons (car rest) result))) (setq rest (cdr rest))) (nreverse result)))) (defun twittering-completing-read (prompt collection &optional predicate require-match initial-input hist def inherit-input-method) "Read a string in the minibuffer, with completion. This is a modified version of `completing-read' and accepts candidates as a list of a string on Emacs21." ;; completing-read() of Emacs21 does not accepts candidates as ;; a list. Candidates must be given as an alist. (let* ((collection (twittering-remove-duplicates collection)) (collection (if (and (> 22 emacs-major-version) (listp collection) (stringp (car collection))) (mapcar (lambda (x) (cons x nil)) collection) collection))) (completing-read prompt collection predicate require-match initial-input hist def inherit-input-method))) (defun twittering-add-to-history (history-var elt &optional maxelt keep-all) (if (functionp 'add-to-history) (add-to-history history-var elt maxelt keep-all) (let* ((added (cons elt (if (and (not keep-all) (boundp 'history-delete-duplicates) history-delete-duplicates) (delete elt (symbol-value history-var)) (symbol-value history-var)))) (maxelt (or maxelt history-length)) (len (length added))) (set history-var (if (<= len maxelt) added (butlast added (- len maxelt))))))) (if (fboundp 'assoc-string) (defalias 'twittering-assoc-string 'assoc-string) (defun twittering-assoc-string (key list &optional case-fold) "Like `assoc' but specifically for strings (and symbols). This returns the first element of LIST whose car matches the string or symbol KEY, or nil if no match exists. When performing the comparison, symbols are first converted to strings, and unibyte strings to multibyte. If the optional arg CASE-FOLD is non-nil, case is ignored. Unlike `assoc', KEY can also match an entry in LIST consisting of a single string, rather than a cons cell whose car is a string. This is reimplemented version of `assoc-string' which is not defined in Emacs21." (let* ((key (if (stringp key) key (symbol-name key))) (regexp (concat "\\`" key "\\'")) (rest list) (result nil) (case-fold-search case-fold)) (while (not (null rest)) (let* ((current (car rest)) (current-key (if (listp current) (car current) current)) (current-key (if (stringp current-key) current-key (symbol-name current-key)))) (if (string-match key current-key) (setq result current rest nil) (setq rest (cdr rest))))) result))) ;;;; ;;;; Debug mode ;;;; (defvar twittering-debug-mode nil) (defvar twittering-debug-buffer "*debug*") (defun twittering-get-or-generate-buffer (buffer) (if (bufferp buffer) (if (buffer-live-p buffer) buffer (generate-new-buffer (buffer-name buffer))) (if (stringp buffer) (or (get-buffer buffer) (generate-new-buffer buffer))))) (defun twittering-debug-buffer () (twittering-get-or-generate-buffer twittering-debug-buffer)) (defmacro debug-print (obj) (let ((obsym (gensym))) `(let ((,obsym ,obj)) (if twittering-debug-mode (with-current-buffer (twittering-debug-buffer) (insert "[debug] " (prin1-to-string ,obsym)) (newline) ,obsym) ,obsym)))) (defun debug-printf (fmt &rest args) (when twittering-debug-mode (with-current-buffer (twittering-debug-buffer) (insert "[debug] " (apply 'format fmt args)) (newline)))) (defun twittering-debug-mode () (interactive) (setq twittering-debug-mode (not twittering-debug-mode)) (message (if twittering-debug-mode "debug mode:on" "debug mode:off"))) ;;;; ;;;; Proxy setting / functions ;;;; (defgroup twittering-proxy nil "Subgroup handling `twittering-mode' proxy setup." :group 'twittering-mode) (defcustom twittering-proxy-use nil "*If non-nil, use PROXY. See also `twittering-proxy-server' for documentation." :type 'boolean :group 'twittering-mode) (defcustom twittering-proxy-server nil "*Proxy server for `twittering-mode'. If both `twittering-proxy-server' and `twittering-proxy-port' are non-nil, the variables `twittering-proxy-*' have priority over other variables `twittering-http-proxy-*' or `twittering-https-proxy-*' regardless of HTTP or HTTPS. To use individual proxies for HTTP and HTTPS, both `twittering-proxy-server' and `twittering-proxy-port' must be nil." :group 'twittering-proxy :type '(choice (const nil) string)) (defcustom twittering-proxy-port nil "*Port number for `twittering-mode'. If both `twittering-proxy-server' and `twittering-proxy-port' are non-nil, the variables `twittering-proxy-*' have priority over other variables `twittering-http-proxy-*' or `twittering-https-proxy-*' regardless of HTTP or HTTPS. To use individual proxies for HTTP and HTTPS, both `twittering-proxy-server' and `twittering-proxy-port' must be nil." :group 'twittering-proxy :type '(choice (const nil) integer)) (defvar twittering-proxy-keep-alive nil) (defcustom twittering-proxy-user nil "*Username for `twittering-proxy-server'. NOTE: If both `twittering-proxy-server' and `twittering-proxy-port' are non-nil, the variables `twittering-proxy-*' have priority over other variables `twittering-http-proxy-*' or `twittering-https-proxy-*' regardless of HTTP or HTTPS.") (defcustom twittering-proxy-password nil "*Password for `twittering-proxy-server'. NOTE: If both `twittering-proxy-server' and `twittering-proxy-port' are non-nil, the variables `twittering-proxy-*' have priority over other variables `twittering-http-proxy-*' or `twittering-https-proxy-*' regardless of HTTP or HTTPS." :group 'twittering-proxy :type '(choice (const nil) string)) (defcustom twittering-http-proxy-server nil "*HTTP proxy server for `twittering-mode'. If nil, it is initialized on entering `twittering-mode'. The port number is specified by `twittering-http-proxy-port'. For HTTPS connection, the proxy specified by `twittering-https-proxy-server' and `twittering-https-proxy-port' is used. NOTE: If both `twittering-proxy-server' and `twittering-proxy-port' are non-nil, the variables `twittering-proxy-*' have priority over other variables `twittering-http-proxy-*' or `twittering-https-proxy-*' regardless of HTTP or HTTPS." :group 'twittering-proxy :type '(choice (const nil) string)) (defcustom twittering-http-proxy-port nil "*Port number of a HTTP proxy server for `twittering-mode'. If nil, it is initialized on entering `twittering-mode'. The server is specified by `twittering-http-proxy-server'. For HTTPS connection, the proxy specified by `twittering-https-proxy-server' and `twittering-https-proxy-port' is used. NOTE: If both `twittering-proxy-server' and `twittering-proxy-port' are non-nil, the variables `twittering-proxy-*' have priority over other variables `twittering-http-proxy-*' or `twittering-https-proxy-*' regardless of HTTP or HTTPS." :group 'twittering-proxy :type '(choice (const nil) integer)) (defcustom twittering-http-proxy-keep-alive nil "*If non-nil, the Keep-alive is enabled. This is experimental." :group 'twittering-proxy :type 'boolean) (defcustom twittering-http-proxy-user nil "*Username for `twittering-http-proxy-server'. NOTE: If both `twittering-proxy-server' and `twittering-proxy-port' are non-nil, the variables `twittering-proxy-*' have priority over other variables `twittering-http-proxy-*' or `twittering-https-proxy-*' regardless of HTTP or HTTPS." :group 'twittering-proxy :type '(choice (const nil) string)) (defcustom twittering-http-proxy-password nil "*Password for `twittering-http-proxy-server'. NOTE: If both `twittering-proxy-server' and `twittering-proxy-port' are non-nil, the variables `twittering-proxy-*' have priority over other variables `twittering-http-proxy-*' or `twittering-https-proxy-*' regardless of HTTP or HTTPS." :group 'twittering-proxy :type '(choice (const nil) string)) (defcustom twittering-https-proxy-server nil "*HTTPS proxy server for `twittering-mode'. If nil, it is initialized on entering `twittering-mode'. The port number is specified by `twittering-https-proxy-port'. For HTTP connection, the proxy specified by `twittering-http-proxy-server' and `twittering-http-proxy-port' is used. NOTE: If both `twittering-proxy-server' and `twittering-proxy-port' are non-nil, the variables `twittering-proxy-*' have priority over other variables `twittering-http-proxy-*' or `twittering-https-proxy-*' regardless of HTTP or HTTPS." :group 'twittering-proxy :type '(choice (const nil) string)) (defcustom twittering-https-proxy-port nil "*Port number of a HTTPS proxy server for `twittering-mode'. If nil, it is initialized on entering `twittering-mode'. The server is specified by `twittering-https-proxy-server'. For HTTP connection, the proxy specified by `twittering-http-proxy-server' and `twittering-http-proxy-port' is used. NOTE: If both `twittering-proxy-server' and `twittering-proxy-port' are non-nil, the variables `twittering-proxy-*' have priority over other variables `twittering-http-proxy-*' or `twittering-https-proxy-*' regardless of HTTP or HTTPS." :group 'twittering-proxy :type '(choice (const nil) integer)) (defcustom twittering-https-proxy-keep-alive nil "*If non-nil, the Keep-alive is enabled. This is experimental." :group 'twittering-proxy :type 'boolean) (defcustom twittering-https-proxy-user nil "*Username for `twittering-https-proxy-server'. NOTE: If both `twittering-proxy-server' and `twittering-proxy-port' are non-nil, the variables `twittering-proxy-*' have priority over other variables `twittering-http-proxy-*' or `twittering-https-proxy-*' regardless of HTTP or HTTPS." :group 'twittering-proxy :type '(choice (const nil) string)) (defcustom twittering-https-proxy-password nil "*Password for `twittering-https-proxy-server'. NOTE: If both `twittering-proxy-server' and `twittering-proxy-port' are non-nil, the variables `twittering-proxy-*' have priority over other variables `twittering-http-proxy-*' or `twittering-https-proxy-*' regardless of HTTP or HTTPS." :group 'twittering-proxy :type '(choice (const nil) string)) (defun twittering-normalize-proxy-vars () "Normalize the type of `twittering-http-proxy-port' and `twittering-https-proxy-port'." (mapc (lambda (sym) (let ((value (symbol-value sym))) (cond ((null value) nil) ((integerp value) nil) ((stringp value) (set sym (string-to-number value))) (t (set sym nil))))) '(twittering-proxy-port twittering-http-proxy-port twittering-https-proxy-port))) (defun twittering-proxy-info (scheme &optional item) "Return an alist for proxy configuration registered for SCHEME. SCHEME must be a string \"http\", \"https\" or a symbol 'http or 'https. The server name is a string and the port number is an integer." (twittering-normalize-proxy-vars) (let ((scheme (if (symbolp scheme) (symbol-name scheme) scheme)) (info-list `((("http" "https") . ((server . ,twittering-proxy-server) (port . ,twittering-proxy-port) (keep-alive . ,twittering-proxy-keep-alive) (user . ,twittering-proxy-user) (password . ,twittering-proxy-password))) (("http") . ((server . ,twittering-http-proxy-server) (port . ,twittering-http-proxy-port) (keep-alive . ,twittering-http-proxy-keep-alive) (user . ,twittering-http-proxy-user) (password . ,twittering-http-proxy-password))) (("https") . ((server . ,twittering-https-proxy-server) (port . ,twittering-https-proxy-port) (keep-alive . ,twittering-https-proxy-keep-alive) (user . ,twittering-https-proxy-user) (password . ,twittering-https-proxy-password)))))) (let ((info (car (remove nil (mapcar (lambda (entry) (when (member scheme (car entry)) (let ((info (cdr entry))) (when (and (cdr (assq 'server info)) (cdr (assq 'port info))) info)))) info-list))))) (if item (cdr (assq item info)) info)))) (defun twittering-url-proxy-services () "Return the current proxy configuration for `twittering-mode' in the format of `url-proxy-services'." (remove nil (mapcar (lambda (scheme) (let ((server (twittering-proxy-info scheme 'server)) (port (twittering-proxy-info scheme 'port))) (when (and server port) `(,scheme . ,(format "%s:%s" server port))))) '("http" "https")))) (defun twittering-find-proxy (scheme) "Find proxy server and its port from the environmental variables and return a cons pair of them. SCHEME must be \"http\" or \"https\"." (cond ((require 'url-methods nil t) (url-scheme-register-proxy scheme) (let* ((proxy-service (assoc scheme url-proxy-services)) (proxy (if proxy-service (cdr proxy-service) nil))) (if (and proxy (string-match "^\\([^:]+\\):\\([0-9]+\\)$" proxy)) (let ((host (match-string 1 proxy)) (port (string-to-number (match-string 2 proxy)))) (cons host port)) nil))) (t (let* ((env-var (concat scheme "_proxy")) (env-proxy (or (getenv (upcase env-var)) (getenv (downcase env-var)))) (default-port (if (string= "https" scheme) "443" "80"))) (if (and env-proxy (string-match "^\\(https?://\\)?\\([^:/]+\\)\\(:\\([0-9]+\\)\\)?/?$" env-proxy)) (let* ((host (match-string 2 env-proxy)) (port-str (or (match-string 4 env-proxy) default-port)) (port (string-to-number port-str))) (cons host port)) nil))))) (defun twittering-setup-proxy () (when (require 'url-methods nil t) ;; If `url-scheme-registry' is not initialized, ;; `url-proxy-services' will be reset by calling ;; `url-insert-file-contents' or `url-retrieve-synchronously', etc. ;; To avoid it, initialize `url-scheme-registry' by calling ;; `url-scheme-get-property' before calling such functions. (url-scheme-get-property "http" 'name) (url-scheme-get-property "https" 'name)) (unless (and twittering-http-proxy-server twittering-http-proxy-port) (let ((info (twittering-find-proxy "http"))) (setq twittering-http-proxy-server (car-safe info)) (setq twittering-http-proxy-port (cdr-safe info)))) (unless (and twittering-https-proxy-server twittering-https-proxy-port) (let ((info (twittering-find-proxy "https"))) (setq twittering-https-proxy-server (car-safe info)) (setq twittering-https-proxy-port (cdr-safe info)))) (if (and twittering-proxy-use (null (twittering-proxy-info "http")) (null (twittering-proxy-info "https"))) (progn (message "Disabling proxy due to lack of configuration.") (setq twittering-proxy-use nil)) t)) (defun twittering-toggle-proxy () (interactive) (setq twittering-proxy-use (not twittering-proxy-use)) (if (twittering-setup-proxy) (message (if twittering-proxy-use "Use Proxy:on" "Use Proxy:off"))) (twittering-update-mode-line)) ;;;; ;;;; Functions for URL library ;;;; (defcustom twittering-url-show-status nil "*If non-nil, show a running total of bytes transferred by urllib. This has effect only if either \"urllib-httpp\" or \"urllib-https\" is used as the connection method." :group 'twittering-mode :type 'boolean) ;;;; ;;;; CA certificate ;;;; (defvar twittering-cert-file nil "The full-path of the file including the certificates authorizing servers on SSL.") (defconst twittering-ca-cert-list '( ;; #BEGIN-CERTIFICATE ;; Verisign Class 3 Public Primary Certification Authority - G3 ;; issuer= /C=US/O=VeriSign, Inc./OU=VeriSign Trust Network/OU=(c) 1999 VeriSign, Inc. - For authorized use only/CN=VeriSign Class 3 Public Primary Certification Authority - G3 ;; subject= /C=US/O=VeriSign, Inc./OU=VeriSign Trust Network/OU=(c) 1999 VeriSign, Inc. - For authorized use only/CN=VeriSign Class 3 Public Primary Certification Authority - G3 ;; serial=9B7E0649A33E62B9D5EE90487129EF57 ;; SHA1 Fingerprint=13:2D:0D:45:53:4B:69:97:CD:B2:D5:C3:39:E2:55:76:60:9B:5C:C6 ;; notBefore=Oct 1 00:00:00 1999 GMT ;; notAfter=Jul 16 23:59:59 2036 GMT "-----BEGIN CERTIFICATE----- MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQsw CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT aWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu IENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8b N3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2t KmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGu kxUccLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBm CC+Vk7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWu imi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my/uRan2Te 2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5fj267Cz3qWhMe DGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC /Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565p F4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGt TxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== -----END CERTIFICATE----- " ;; GeoTrust Global CA ;; issuer= /C=US/O=GeoTrust Inc./CN=GeoTrust Global CA ;; subject= /C=US/O=GeoTrust Inc./CN=GeoTrust Global CA ;; serial=023456 ;; SHA1 Fingerprint=DE:28:F4:A4:FF:E5:B9:2F:A3:C5:03:D1:A3:49:A7:F9:96:2A:82:12 ;; notBefore=May 21 04:00:00 2002 GMT ;; notAfter=May 21 04:00:00 2022 GMT "-----BEGIN CERTIFICATE----- MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9 9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU 1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+ bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV 5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw== -----END CERTIFICATE----- " ;; DigiCert High Assurance EV Root CA ;; issuer= /C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert High Assurance EV Root CA ;; subject= /C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert High Assurance EV Root CA ;; serial=02AC5C266A0B409B8F0B79F2AE462577 ;; SHA1 Fingerprint=5F:B7:EE:06:33:E2:59:DB:AD:0C:4C:9A:E6:D3:8F:1A:61:C7:DC:25 ;; notBefore=Nov 10 00:00:00 2006 GMT ;; notAfter=Nov 10 00:00:00 2031 GMT "-----BEGIN CERTIFICATE----- MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm +9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3 hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2 Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep +OkuE6N36B9K -----END CERTIFICATE----- " ;; VeriSign Class 3 Public Primary Certification Authority - G5 ;; issuer= /C=US/O=VeriSign, Inc./OU=VeriSign Trust Network/OU=(c) 2006 VeriSign, Inc. - For authorized use only/CN=VeriSign Class 3 Public Primary Certification Authority - G5 ;; subject= /C=US/O=VeriSign, Inc./OU=VeriSign Trust Network/OU=(c) 2006 VeriSign, Inc. - For authorized use only/CN=VeriSign Class 3 Public Primary Certification Authority - G5 ;; serial=18DAD19E267DE8BB4A2158CDCC6B3B4A ;; SHA1 Fingerprint=4E:B6:D5:78:49:9B:1C:CF:5F:58:1E:AD:56:BE:3D:9B:67:44:A5:E5 ;; notBefore=Nov 8 00:00:00 2006 GMT ;; notAfter=Jul 16 23:59:59 2036 GMT "-----BEGIN CERTIFICATE----- MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0 aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1 nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+ rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/ NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y 5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ 4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq -----END CERTIFICATE----- " ;; VeriSign Universal Root Certification Authority ;; issuer= /C=US/O=VeriSign, Inc./OU=VeriSign Trust Network/OU=(c) 2008 VeriSign, Inc. - For authorized use only/CN=VeriSign Universal Root Certification Authority ;; subject= /C=US/O=VeriSign, Inc./OU=VeriSign Trust Network/OU=(c) 2008 VeriSign, Inc. - For authorized use only/CN=VeriSign Universal Root Certification Authority ;; serial=401AC46421B31321030EBBE4121AC51D ;; SHA1 Fingerprint=36:79:CA:35:66:87:72:30:4D:30:A5:FB:87:3B:0F:A7:7B:B7:0D:54 ;; notBefore=Apr 2 00:00:00 2008 GMT ;; notAfter=Dec 1 23:59:59 2037 GMT "-----BEGIN CERTIFICATE----- MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCB vTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJp U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MTgwNgYDVQQDEy9W ZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe Fw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJVUzEX MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0 IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9y IGF1dGhvcml6ZWQgdXNlIG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNh bCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF AAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj1mCOkdeQmIN65lgZOIzF 9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGPMiJhgsWH H26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+H LL729fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN /BMReYTtXlT2NJ8IAfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPT rJ9VAMf2CGqUuV/c4DPxhGD5WycRtPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1Ud EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0GCCsGAQUFBwEMBGEwX6FdoFsw WTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2Oa8PPgGrUSBgs exkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4 sAPmLGd75JR3Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+ seQxIcaBlVZaDrHC1LGmWazxY8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz 4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTxP/jgdFcrGJ2BtMQo2pSXpXDrrB2+ BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+PwGZsY6rp2aQW9IHR lRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4mJO3 7M2CYfE45k+XmCpajQ== -----END CERTIFICATE----- " ;; VeriSign Class 3 Public Primary Certification Authority - G4 ;; issuer= /C=US/O=VeriSign, Inc./OU=VeriSign Trust Network/OU=(c) 2007 VeriSign, Inc. - For authorized use only/CN=VeriSign Class 3 Public Primary Certification Authority - G4 ;; subject= /C=US/O=VeriSign, Inc./OU=VeriSign Trust Network/OU=(c) 2007 VeriSign, Inc. - For authorized use only/CN=VeriSign Class 3 Public Primary Certification Authority - G4 ;; serial=2F80FE238C0E220F486712289187ACB3 ;; SHA1 Fingerprint=22:D5:D8:DF:8F:02:31:D1:8D:F7:9D:B7:CF:8A:2D:64:C9:3F:6C:3A ;; notBefore=Nov 5 00:00:00 2007 GMT ;; notAfter=Jan 18 23:59:59 2038 GMT "-----BEGIN CERTIFICATE----- MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjEL MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2ln biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y aXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjELMAkG A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJp U2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwg SW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2ln biBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8Utpkmw4tXNherJI9/gHm GUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGzrl0Bp3ve fLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUw AwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJ aW1hZ2UvZ2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYj aHR0cDovL2xvZ28udmVyaXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMW kf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMDA2gAMGUCMGYhDBgmYFo4e1ZC 4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIxAJw9SDkjOVga FRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== -----END CERTIFICATE----- " ;; #END-CERTIFICATE )) (defun twittering-delete-ca-cert () (when (and twittering-cert-file (file-exists-p twittering-cert-file)) (delete-file twittering-cert-file)) (setq twittering-cert-file nil)) (defun twittering-ensure-ca-cert () "Return a full-path of the file including CA certificates. If it does not exist, create it. The directory includes root certificates in \"hash format\". In detail, see verify(1SSL)." (unless twittering-cert-file (let ((coding-system-for-write 'iso-safe) (file (make-temp-file "twmode-cacert"))) (with-temp-file file (apply 'insert twittering-ca-cert-list)) (setq twittering-cert-file file) (add-hook 'kill-emacs-hook 'twittering-delete-ca-cert))) twittering-cert-file) ;;;; ;;;; User agent ;;;; (defvar twittering-user-agent-function 'twittering-user-agent-default-function) (defun twittering-user-agent-default-function () "Twittering mode default User-Agent function." (format "Emacs/%d.%d Twittering-mode/%s" emacs-major-version emacs-minor-version twittering-mode-version)) (defun twittering-user-agent () "Return User-Agent header string." (funcall twittering-user-agent-function)) ;;;; ;;;; Basic HTTP functions (general) ;;;; (defun twittering-percent-encode (str &optional coding-system) "Encode STR according to Percent-Encoding defined in RFC 3986." (twittering-oauth-url-encode str coding-system)) (defun twittering-lookup-connection-type (use-ssl &optional order table) "Return available entry extracted fron connection type table. TABLE is connection type table, which is an alist of type symbol and its item alist, such as '((native (check . t) (https . twittering-start-http-session-native-tls-p) (start . twittering-start-http-session-native)) (curl (check . twittering-start-http-session-curl-p) (https . twittering-start-http-session-curl-https-p) (start . twittering-start-http-session-curl))) . ORDER means the priority order of type symbols. If USE-SSL is nil, the item `https' is ignored. When the type `curl' has priority and is available for the above table, the function returns '((check . twittering-start-http-session-curl-p) (https . twittering-start-http-session-curl-https-p) (start . twittering-start-http-session-curl)) ." (let ((rest (or order twittering-connection-type-order)) (table (or table twittering-connection-type-table)) (result nil)) (while (and rest (null result)) (let* ((candidate (car rest)) (entry (cons `(symbol . ,candidate) (cdr (assq candidate table)))) (entry (if (assq 'display-name entry) entry (cons `(display-name . ,(symbol-name candidate)) entry))) (validate (lambda (item) (let ((v (cdr (assq item entry)))) (or (null v) (eq t v) (functionp v))))) (confirm (lambda (item) (let ((v (cdr (assq item entry)))) (cond ((null v) nil) ((eq t v) t) ((functionp v) (funcall v))))))) (if (and (funcall validate 'check) (or (not use-ssl) (funcall validate 'https))) (cond ((and (funcall confirm 'check) (or (not use-ssl) (funcall confirm 'https))) (setq rest nil) (setq result entry)) (t (setq rest (cdr rest)))) (message "The configuration for conncetion type `%s' is invalid." candidate) (setq rest nil)))) result)) (defun twittering-get-connection-method-name (use-ssl) "Return a name of the preferred connection method. If USE-SSL is non-nil, return a connection method for HTTPS. If USE-SSL is nil, return a connection method for HTTP." (cdr (assq 'display-name (twittering-lookup-connection-type use-ssl)))) (defun twittering-lookup-http-start-function (&optional order table) "Decide a connection method from currently available methods." (let ((entry (twittering-lookup-connection-type twittering-use-ssl order table))) (cdr (assq 'send-http-request entry)))) (defun twittering-ensure-connection-method (&optional order table) "Ensure a connection method with a compromise. Return nil if no connection methods are available with a compromise." (let* ((use-ssl (or twittering-use-ssl twittering-oauth-use-ssl)) (entry (twittering-lookup-connection-type use-ssl order table))) (cond (entry t) ((and (null entry) use-ssl (yes-or-no-p "HTTPS(SSL) is unavailable. Use HTTP instead? ")) ;; Fall back on connection without SSL. (setq twittering-use-ssl nil) (setq twittering-oauth-use-ssl nil) (twittering-update-mode-line) (twittering-ensure-connection-method order table)) (t (message "No connection methods are available.") nil)))) (defun twittering-make-http-request (method header-list host port path query-parameters post-body use-ssl) "Returns an alist specifying a HTTP request. METHOD specifies HTTP method. It must be \"GET\" or \"POST\". HEADER-LIST is a list of (field-name . field-value) specifying HTTP header fields. The fields \"Host\", \"User-Agent\" and \"Content-Length\" are automatically filled if necessary. HOST specifies the host. PORT specifies the port. This must be an integer. PATH specifies the absolute path in URI (without query string). QUERY-PARAMTERS is a string or an alist. If QUERY-PARAMTERS is a string, it is treated as an encoded query string. If QUERY-PARAMTERS is an alist, it represents a list of cons pairs of string, (query-key . query-value). POST-BODY specifies the post body sent when METHOD equals to \"POST\". If POST-BODY is nil, no body is posted. If USE-SSL is non-nil, the request is performed with SSL. The result alist includes the following keys, where a key is a symbol. method: HTTP method such as \"GET\" or \"POST\". scheme: the scheme name. \"http\" or \"https\". host: the host to which the request is sent. port: the port to which the request is sent (integer). path: the absolute path string. Note that it does not include query string. query-string: the query string. encoded-query-alist: the alist consisting of pairs of encoded query-name and encoded query-value. uri: the URI. It includes the query string. uri-without-query: the URI without the query string. header-list: an alist specifying pairs of a parameter and its value in HTTP header field. post-body: the entity that will be posted." (let* ((scheme (if use-ssl "https" "http")) (default-port (if use-ssl 443 80)) (port (if port port default-port)) (query-string (cond ((stringp query-parameters) query-parameters) ((consp query-parameters) (mapconcat (lambda (pair) (cond ((stringp pair) (twittering-percent-encode pair)) ((consp pair) (format "%s=%s" (twittering-percent-encode (car pair)) (twittering-percent-encode (cdr pair)))) (t nil))) query-parameters "&")) (t nil))) (encoded-query-alist (cond ((stringp query-parameters) ;; Query name and its value must be already encoded. (mapcar (lambda (str) (if (string-match "=" str) (let ((key (substring str 0 (match-beginning 0))) (value (substring str (match-end 0)))) `(,key . ,value)) `(,str . nil))) (split-string query-parameters "&"))) ((consp query-parameters) (mapcar (lambda (pair) (cond ((stringp pair) (cons (twittering-percent-encode pair) nil)) ((consp pair) (cons (twittering-percent-encode (car pair)) (twittering-percent-encode (cdr pair)))) (t nil))) query-parameters)) (t nil))) (uri-without-query (concat scheme "://" host (when (and port (not (= port default-port))) (format ":%d" port)) path)) (uri (if query-string (concat uri-without-query "?" query-string) uri-without-query)) (header-list `(,@(when (and (string= method "POST") (not (assoc "Content-Length" header-list))) `(("Content-Length" . ,(format "%d" (length post-body))))) ,@(unless (assoc "Host" header-list) `(("Host" . ,host))) ,@(unless (assoc "User-Agent" header-list) `(("User-Agent" . ,(twittering-user-agent)))) ,@header-list))) (cond ((not (member method '("POST" "GET"))) (error "Unknown HTTP method: %s" method) nil) ((not (string-match "^/" path)) (error "Invalid HTTP path: %s" path) nil) (t `((method . ,method) (scheme . ,scheme) (host . ,host) (port . ,port) (path . ,path) (query-string . ,query-string) (encoded-query-alist . ,encoded-query-alist) (uri . ,uri) (uri-without-query . ,uri-without-query) (header-list . ,header-list) (post-body . ,post-body)))))) (defun twittering-make-http-request-from-uri (method header-list uri &optional post-body) "Returns an alist specifying a HTTP request. The result alist has the same form as an alist generated by `twittering-make-http-request'. METHOD specifies HTTP method. It must be \"GET\" or \"POST\". HEADER-LIST is a list of (field-name . field-value) specifying HTTP header fields. The fields \"Host\" and \"User-Agent\" are automatically filled if necessary. URI specifies the URI including query string. POST-BODY specifies the post body sent when METHOD equals to \"POST\". If POST-BODY is nil, no body is posted." (let* ((parts-alist (let ((parsed-url (url-generic-parse-url uri))) ;; This is required for the difference of url library ;; distributed with Emacs 22 and 23. (cond ((and (fboundp 'url-p) (url-p parsed-url)) ;; Emacs 23 and later. `((scheme . ,(url-type parsed-url)) (host . ,(url-host parsed-url)) (port . ,(url-portspec parsed-url)) (path . ,(url-filename parsed-url)))) ((vectorp parsed-url) ;; Emacs 22. `((scheme . ,(aref parsed-url 0)) (host . ,(aref parsed-url 3)) (port . ,(aref parsed-url 4)) (path . ,(aref parsed-url 5)))) (t nil)))) (path (let ((path (cdr (assq 'path parts-alist)))) (if (string-match "\\`\\(.*\\)\\?" path) (match-string 1 path) path))) (query-string (let ((path (cdr (assq 'path parts-alist)))) (if (string-match "\\?\\(.*\\)\\'" path) (match-string 1 path) nil)))) (twittering-make-http-request method header-list (cdr (assq 'host parts-alist)) (cdr (assq 'port parts-alist)) path query-string post-body (string= "https" (cdr (assq 'scheme parts-alist)))))) (defun twittering-make-connection-info (request &optional additional order table) "Make an alist specifying the information of connection for REQUEST. REQUEST must be an alist that has the same keys as that generated by `twittering-make-http-request'. ADDITIONAL is appended to the tail of the result alist. Following ADDITIONAL, an entry in TABLE is also appended to the result alist, where `twittering-lookup-connection-type' determines the entry according to the priority order ORDER. If ORDER is nil, `twittering-connection-type-order' is used in place of ORDER. If TABLE is nil, `twittering-connection-type-table' is used in place of TABLE. The parameter symbols are following: use-ssl: whether SSL is enabled or not. allow-insecure-server-cert: non-nil if an insecure server certificate is allowed on SSL. cacert-file-fullpath: the full-path of a file including the certificates authorizing a server certificate on SSL. The file must be in PEM format. use-proxy: non-nil if using a proxy. proxy-server: a proxy server or nil. proxy-port: a port for connecting the proxy (integer) or nil. proxy-user: a username for connecting the proxy or nil. proxy-password: a password for connecting the proxy or nil. request: an alist specifying a HTTP request." (let* ((order (or order twittering-connection-type-order)) (table (or table twittering-connection-type-table)) (scheme (cdr (assq 'scheme request))) (use-ssl (string= "https" scheme)) (entry (twittering-lookup-connection-type use-ssl order table))) `((use-ssl . ,use-ssl) (allow-insecure-server-cert . ,twittering-allow-insecure-server-cert) (cacert-file-fullpath . ,(when use-ssl (twittering-ensure-ca-cert))) (use-proxy . ,twittering-proxy-use) ,@(when twittering-proxy-use `((proxy-server . ,(twittering-proxy-info scheme 'server)) (proxy-port . ,(twittering-proxy-info scheme 'port)) (proxy-user . ,(twittering-proxy-info scheme 'user)) (proxy-password . ,(twittering-proxy-info scheme 'password)))) (request . ,request) ,@additional ,@entry))) (defun twittering-get-response-header (buffer) "Extract HTTP response header from HTTP response. BUFFER may be a buffer or the name of an existing buffer which contains the HTTP response." (with-current-buffer buffer (save-excursion (goto-char (point-min)) (if (search-forward-regexp "\r?\n\r?\n" nil t) (prog1 (buffer-substring (point-min) (match-end 0)) (when twittering-debug-mode (debug-printf "connection-info=%s\n" connection-info) (debug-print "HTTP response header:\n--BEGIN\n") (debug-print (buffer-substring (point-min) (match-end 0))) (debug-print "--END\n"))) nil)))) (defun twittering-make-header-info-alist (header-str) "Make HTTP header alist from HEADER-STR. The alist consists of pairs of field-name and field-value, such as '((\"Content-Type\" . \"application/xml\; charset=utf-8\") (\"Content-Length\" . \"2075\"))." (let* ((lines (split-string header-str "\r?\n")) (status-line (car lines)) (header-lines (cdr lines))) (when (string-match "^\\(HTTP/1\\.[01]\\|HTTP/2\\(?:\\.0\\)?\\) \\([0-9][0-9][0-9]\\)\\(.*\\)$" status-line) (append `((status-line . ,status-line) (http-version . ,(match-string 1 status-line)) (status-code . ,(match-string 2 status-line)) (reason-phrase . ,(match-string 3 status-line))) (remove nil (mapcar (lambda (line) (when (string-match "^\\([^: ]*\\): *\\(.*\\)$" line) (cons (match-string 1 line) (match-string 2 line)))) header-lines)))))) (defun twittering-get-content-subtype-symbol-from-header-info (header-info) "Return a symbol corresponding to the subtype of content-type." (let* ((content-type ;; According to RFC2616, field name of a HTTP header is ;; case-insensitive. (car (remove nil (mapcar (lambda (entry) (when (and (stringp (car entry)) (let ((case-fold-search t)) (string-match "\\`content-type\\'" (car entry)))) (cdr entry))) header-info)))) (subtype (when (and (stringp content-type) (string-match "\\` *[^/]*/\\([^ ;]*\\)" content-type)) (downcase (match-string 1 content-type)))) (symbol-alist '(("json" . json) ("atom+xml" . atom) ("xml" . xml)))) (cdr (assoc subtype symbol-alist)))) (defun twittering-decode-response-body (header-info) "Decode the current buffer according to the content-type in HEADER-INFO." (let* ((content-type ;; According to RFC2616, field name of a HTTP header is ;; case-insensitive. (car (remove nil (mapcar (lambda (entry) (when (and (stringp (car entry)) (let ((case-fold-search t)) (string-match "\\`content-type\\'" (car entry)))) (cdr entry))) header-info)))) (parameters (when (stringp content-type) (cdr (split-string content-type ";")))) (regexp "^[[:space:]]*charset=utf-8[[:space:]]*$") (encoded-with-utf-8 (let ((case-fold-search t)) (remove nil (mapcar (lambda (entry) (string-match regexp entry)) parameters))))) (when encoded-with-utf-8 (decode-coding-region (point-min) (point-max) 'utf-8)))) (defun twittering-send-http-request-internal (request additional-info sentinel &optional order table) "Open a connection and return a subprocess object for the connection. REQUEST must be an alist that has the same keys as that generated by `twittering-make-http-request'. SENTINEL is called as a function when the process changes state. It gets three arguments: the process, a string describing the change, and the connection-info, which is generated by `twittering-make-connection-info' and also includes an alist ADDITIONAL-INFO. How to perform the request is selected from TABLE according to the priority order ORDER. ORDER and TABLE are directly sent to `twittering-make-connection-info'. If ORDER is nil, `twittering-connection-type-order' is used in place of ORDER. If TABLE is nil, `twittering-connection-type-table' is used in place of TABLE. " (let* ((order (or order twittering-connection-type-order)) (table (or table twittering-connection-type-table)) (connection-info (twittering-make-connection-info request additional-info order table)) (func (cdr (assq 'send-http-request connection-info))) (temp-buffer (generate-new-buffer "*twmode-http-buffer*")) ;; Bind `default-directory' to the temporary directory ;; because it is possible that the directory pointed by ;; `default-directory' has been already removed. (default-directory temporary-file-directory)) (cond ((and func (functionp func)) (funcall func "*twmode-generic*" temp-buffer connection-info (when (and sentinel (functionp sentinel)) (lexical-let ((sentinel sentinel) (connection-info connection-info)) (lambda (proc status) (apply sentinel proc status connection-info nil)))))) (t (error "No valid connection method is found") nil)))) (defun twittering-send-http-request (request additional-info func &optional clean-up-func) "Send a HTTP request and return a subprocess object for the connection. REQUEST must be an alist that has the same keys as that generated by `twittering-make-http-request'. FUNC is called when a HTTP response has been received without errors. It is called with the current buffer containing the HTTP response (without HTTP headers). FUNC is called with four arguments: the process, a symbol describing the status of the process, a connection-info generated by `twittering-make-connection-info', and a header-info generated by `twittering-get-response-header' and `twittering-make-header-info-alist'. The connection-info also includes an alist ADDITIONAL-INFO. If FUNC returns non-nil and `twittering-buffer-related-p' is non-nil, the returned value is displayed as a message. And also, if FUNC returns a string and it matches the regular expression \"^\\\\(Failuare\\\\|Response\\\\): \", the returned value is displayed as a message. CLEAN-UP-FUNC is called whenever the sentinel of the subprocess for the connection is called (as `set-process-sentinel'). It is called with three arguments: the process, a symbol describing the status of the proess, and a connection-info generated by `twittering-make-connection-info'. They are the same as arguments for FUNC. When a HTTP response has been received, FUNC is called in advance of CLEAN-UP-FUNC. CLEAN-UP-FUNC can overwrite the message displayed by FUNC. If the subprocess has exited, the buffer bound to it is automatically killed after calling CLEAN-UP-FUNC. The method to perform the request is determined from `twittering-connection-type-table' according to the priority order `twittering-connection-type-order'." (lexical-let ((func func) (clean-up-func clean-up-func)) (twittering-send-http-request-internal request additional-info (lambda (proc status-str connection-info) (let ((status (cond ((string= status-str "urllib-finished") 'exit) ((processp proc) (process-status proc)) (t nil))) (buffer (process-buffer proc)) (exit-status (cond ((string= status-str "urllib-finished") 0) ((processp proc) (process-exit-status proc)) (t 1))) (command (process-command proc)) (pre-process-func (cdr (assq 'pre-process-buffer connection-info))) (mes nil)) (unwind-protect (setq mes (cond ((null status) (format "Failure: process %s does not exist" proc)) ((or (memq status '(run stop open listen connect)) (not (memq status '(exit signal closed failed)))) ;; If the process is running, FUNC is not called. nil) ((and command (not (= 0 exit-status))) ;; If the process abnormally exited, (format "Failure: %s exited abnormally (exit-status=%s)" (car command) exit-status)) ((not (buffer-live-p buffer)) (format "Failure: the buffer for %s is already killed" proc)) (t (when (functionp pre-process-func) ;; Pre-process buffer. (funcall pre-process-func proc buffer connection-info)) (let* ((header (twittering-get-response-header buffer)) (header-info (and header (twittering-make-header-info-alist header)))) (with-current-buffer buffer (goto-char (point-min)) (when (search-forward-regexp "\r?\n\r?\n" nil t) ;; delete HTTP headers. (delete-region (point-min) (match-end 0))) ;; It may be necessary to decode the contents of ;; the buffer by UTF-8 because ;; `twittering-http-application-headers' specifies ;; utf-8 as one of acceptable charset. ;; For the present, only UTF-8 is taken into account. (twittering-decode-response-body header-info) (apply func proc status connection-info header-info nil)))))) ;; unwind-forms (setq mes (cond ((null mes) nil) ((string-match "^\\(Failure\\|Response\\): " mes) (let* ((request (cdr (assq 'request connection-info))) (method (cdr (assq 'method request))) (uri (cdr (assq 'uri request)))) (concat mes " for " method " " uri))) ((twittering-buffer-related-p) mes))) (when mes ;; CLEAN-UP-FUNC can overwrite a message from the return value ;; of FUNC. (message "%s" mes)) (when (functionp clean-up-func) (funcall clean-up-func proc status connection-info)) (when (and (memq status '(exit signal closed failed)) (buffer-live-p buffer) (not twittering-debug-mode)) (kill-buffer buffer)))))))) ;;;; ;;;; Basic HTTP functions with tls and Emacs builtins. ;;;; (eval-when-compile (require 'tls nil t)) (defun twittering-start-http-session-native-tls-p () (when (and (not twittering-proxy-use) (require 'tls nil t)) (unless twittering-tls-program (let ((programs (remove nil (mapcar (lambda (cmd) (when (string-match "\\`\\([^ ]+\\) " cmd) (when (executable-find (match-string 1 cmd)) cmd))) tls-program)))) (setq twittering-tls-program (if twittering-allow-insecure-server-cert (mapcar (lambda (str) (cond ((string-match "^\\([^ ]*/\\)?openssl s_client " str) (concat (match-string 0 str) "-verify 0 " (substring str (match-end 0)))) ((string-match "^\\([^ ]*/\\)?gnutls-cli " str) (concat (match-string 0 str) "--insecure " (substring str (match-end 0)))) (t str))) programs) programs)))) (not (null twittering-tls-program)))) ;; TODO: proxy (defun twittering-send-http-request-native (name buffer connection-info sentinel) (let* ((request (cdr (assq 'request connection-info))) (uri (cdr (assq 'uri connection-info))) (method (cdr (assq 'method request))) (scheme (cdr (assq 'scheme request))) (host (cdr (assq 'host request))) (port (cdr (assq 'port request))) (path (cdr (assq 'path request))) (query-string (cdr (assq 'query-string request))) (post-body (cdr (assq 'post-body request))) (use-proxy (cdr (assq 'use-proxy connection-info))) (proxy-server (cdr (assq 'proxy-server connection-info))) (proxy-port (cdr (assq 'proxy-port connection-info))) (proxy-user (cdr (assq 'proxy-user connection-info))) (proxy-password (cdr (assq 'proxy-password connection-info))) (proxy-credentials (when (and proxy-user proxy-password) (concat "Basic " (base64-encode-string (concat proxy-user ":" proxy-password))))) (header-list (let ((original-header-list (cdr (assq 'header-list request)))) (if proxy-credentials (cons `("Proxy-Authorization" ,proxy-credentials) original-header-list) original-header-list))) (use-ssl (cdr (assq 'use-ssl connection-info))) (allow-insecure-server-cert (cdr (assq 'allow-insecure-server-cert connection-info))) (connect-host (or proxy-server host)) (connect-port (or proxy-port port)) (request-str (format "%s %s HTTP/1.1\r\n%s\r\n\r\n%s\r\n" method (if use-proxy ;; As described in 5.1.2 of RFC2616, the ;; absolute URI is required here if the connection ;; uses a proxy. uri (concat path (when query-string (concat "?" query-string)))) (mapconcat (lambda (pair) (format "%s: %s" (car pair) (cdr pair))) header-list "\r\n") (or post-body ""))) (coding-system-for-read 'binary) (coding-system-for-write 'binary) (tls-program twittering-tls-program) (proc (funcall (if use-ssl 'open-tls-stream 'open-network-stream) "network-connection-process" nil connect-host connect-port))) (when proc (set-process-buffer proc buffer) (when (functionp sentinel) (if (twittering-process-alive-p proc) (set-process-sentinel proc sentinel) (funcall sentinel proc "finished"))) (process-send-string proc request-str) proc))) (defun twittering-pre-process-buffer-native (proc buffer connection-info) (let ((use-ssl (cdr (assq 'use-ssl connection-info))) (args (process-command proc))) (cond ((and use-ssl args (car (remove nil (mapcar (lambda (cmd) (string-match "^\\(.*/\\)?gnutls-cli\\b" cmd)) args)))) (with-current-buffer buffer (save-excursion (goto-char (point-max)) (when (search-backward-regexp "- Peer has closed the GNUTLS connection\r?\n\\'") (let ((beg (match-beginning 0)) (end (match-end 0))) (delete-region beg end)))))) ((and use-ssl args (car (remove nil (mapcar (lambda (cmd) (string-match "^\\(.*/\\)?openssl s_client\\b" cmd)) args)))) (with-current-buffer buffer (save-excursion (goto-char (point-max)) (when (search-backward-regexp "closed\r?\n\\'") (let ((beg (match-beginning 0)) (end (match-end 0))) (delete-region beg end)))))) (t nil)))) ;;;; ;;;; Basic HTTP functions with curl ;;;; (defun twittering-find-curl-program () "Returns an appropriate `curl' program pathname or nil if not found." (or (executable-find "curl") (let ((windows-p (memq system-type '(windows-nt cygwin))) (curl.exe (expand-file-name "curl.exe" (expand-file-name "win-curl" (file-name-directory (symbol-file 'twit)))))) (and windows-p (file-exists-p curl.exe) curl.exe)))) (defun twittering-start-http-session-curl-p () "Return t if curl was installed, otherwise nil." (unless twittering-curl-program (setq twittering-curl-program (twittering-find-curl-program))) (not (null twittering-curl-program))) (defun twittering-start-http-session-curl-https-p () "Return t if curl was installed and the curl support HTTPS, otherwise nil." (when (twittering-start-http-session-curl-p) (unless twittering-curl-program-https-capability (with-temp-buffer (let ((coding-system-for-read 'iso-safe) (coding-system-for-write 'iso-safe) ;; Bind `default-directory' to the temporary directory ;; because it is possible that the directory pointed by ;; `default-directory' has been already removed. (default-directory temporary-file-directory)) (call-process twittering-curl-program nil (current-buffer) nil "--version") (goto-char (point-min)) (setq twittering-curl-program-https-capability (if (search-forward-regexp "^Protocols: .*https" nil t) 'capable 'incapable))))) (eq twittering-curl-program-https-capability 'capable))) (defun twittering-start-http-session-curl-http2-p () "Return t if the curl support HTTP2, otherwise nil." (when (twittering-start-http-session-curl-p) (unless twittering-curl-program-http2-capability (with-temp-buffer (let ((coding-system-for-read 'iso-safe) (coding-system-for-write 'iso-safe) ;; Bind `default-directory' to the temporary directory ;; because it is possible that the directory pointed by ;; `default-directory' has been already removed. (default-directory temporary-file-directory)) (call-process twittering-curl-program nil (current-buffer) nil "--version") (goto-char (point-min)) (setq twittering-curl-program-http2-capability (if (search-forward-regexp "^Features:.* HTTP2" nil t) 'capable 'incapable))))) (eq twittering-curl-program-http2-capability 'capable))) (defun twittering-send-http-request-curl (name buffer connection-info sentinel) (let* ((request (cdr (assq 'request connection-info))) (method (cdr (assq 'method request))) (uri (cdr (assq 'uri request))) (header-list (cdr (assq 'header-list request))) (post-body (cdr (assq 'post-body request))) (use-proxy (cdr (assq 'use-proxy connection-info))) (proxy-server (cdr (assq 'proxy-server connection-info))) (proxy-port (cdr (assq 'proxy-port connection-info))) (proxy-user (cdr (assq 'proxy-user connection-info))) (proxy-password (cdr (assq 'proxy-password connection-info))) (use-ssl (cdr (assq 'use-ssl connection-info))) (use-http2 (twittering-start-http-session-curl-http2-p)) (allow-insecure-server-cert (cdr (assq 'allow-insecure-server-cert connection-info))) (cacert-file-fullpath (cdr (assq 'cacert-file-fullpath connection-info))) (cacert-file-base-directory (when cacert-file-fullpath (file-name-directory cacert-file-fullpath))) (cacert-file-body (when cacert-file-fullpath (file-name-nondirectory cacert-file-fullpath))) (header-list `(,@header-list ;; Make `curl' remove the HTTP header field "Expect" for ;; avoiding '417 Expectation Failed' HTTP response error. ;; The header field is automatically added for a HTTP request ;; exceeding 1024 byte. See ;; http://d.hatena.ne.jp/imait/20091228/1262004813 and ;; http://www.escafrace.co.jp/blog/09/10/16/1008 ("Expect" . ""))) (curl-args `("--include" "--silent" "--compressed" ,@(when use-http2 `("--http2")) ,@(apply 'append (mapcar (lambda (pair) ;; Do not overwrite internal headers `curl' would use. ;; Thanks to William Xu. ;; "cURL - How To Use" ;; http://curl.haxx.se/docs/manpage.html (unless (string= (car pair) "Host") `("-H" ,(format "%s: %s" (car pair) (cdr pair))))) header-list)) ,@(when use-ssl `("--cacert" ,cacert-file-body)) ,@(when (and use-ssl allow-insecure-server-cert) `("--insecure")) ,@(when (and use-proxy proxy-server proxy-port) (append `("-x" ,(format "%s:%s" proxy-server proxy-port)) (when (and proxy-user proxy-password) `("-U" ,(format "%s:%s" proxy-user proxy-password))))) ,@(when (string= "POST" method) `("-d" ,(or post-body ""))) ,uri)) (coding-system-for-read 'binary) (coding-system-for-write 'binary) (default-directory ;; If `use-ssl' is non-nil, the `curl' process ;; is executed at the same directory as the temporary cert file. ;; Without changing directory, `curl' misses the cert file if ;; you use Emacs on Cygwin because the path on Emacs differs ;; from Windows. ;; With changing directory, `curl' on Windows can find the cert ;; file if you use Emacs on Cygwin. (if use-ssl cacert-file-base-directory default-directory))) (twittering-start-process-with-sentinel name buffer twittering-curl-program curl-args sentinel))) (defun twittering-pre-process-buffer-curl (proc buffer connection-info) (let ((use-ssl (cdr (assq 'use-ssl connection-info))) (use-proxy (cdr (assq 'use-proxy connection-info)))) (when (and use-ssl use-proxy) ;; When using SSL via a proxy with CONNECT method, ;; omit a successful HTTP response and headers if they seem to be ;; sent from the proxy. (with-current-buffer buffer (save-excursion (goto-char (point-min)) (let ((first-regexp ;; successful HTTP response "\\`HTTP/\\(1\\.[01]\\|2\\(\\.0\\)?\\) 2[0-9][0-9].*?\r?\n") (next-regexp ;; following HTTP response "^\\(\r?\n\\)HTTP/\\(1\\.[01]\\|2\\(\\.0\\)?\\) [0-9][0-9][0-9].*?\r?\n")) (when (and (search-forward-regexp first-regexp nil t) (search-forward-regexp next-regexp nil t)) (let ((beg (point-min)) (end (match-end 1))) (delete-region beg end))))))))) ;;;; ;;;; Basic HTTP functions with wget ;;;; (defun twittering-find-wget-program () "Returns an appropriate `wget' program pathname or nil if not found." (executable-find "wget")) (defun twittering-start-http-session-wget-p () "Return t if `wget' was installed, otherwise nil." (unless twittering-wget-program (setq twittering-wget-program (twittering-find-wget-program))) (not (null twittering-wget-program))) (defun twittering-send-http-request-wget (name buffer connection-info sentinel) (let* ((request (cdr (assq 'request connection-info))) (method (cdr (assq 'method request))) (scheme (cdr (assq 'scheme request))) (uri (cdr (assq 'uri request))) (header-list (cdr (assq 'header-list request))) (post-body (cdr (assq 'post-body request))) (use-proxy (cdr (assq 'use-proxy connection-info))) (proxy-server (cdr (assq 'proxy-server connection-info))) (proxy-port (cdr (assq 'proxy-port connection-info))) (proxy-user (cdr (assq 'proxy-user connection-info))) (proxy-password (cdr (assq 'proxy-password connection-info))) (use-ssl (cdr (assq 'use-ssl connection-info))) (allow-insecure-server-cert (cdr (assq 'allow-insecure-server-cert connection-info))) (cacert-file-fullpath (cdr (assq 'cacert-file-fullpath connection-info))) (cacert-file-base-directory (when cacert-file-fullpath (file-name-directory cacert-file-fullpath))) (cacert-file-body (when cacert-file-fullpath (file-name-nondirectory cacert-file-fullpath))) (args `("--save-headers" "--quiet" "--output-document=-" ,@(remove nil (mapcar (lambda (pair) (unless (string= (car pair) "Host") (format "--header=%s: %s" (car pair) (cdr pair)))) header-list)) ,@(when use-ssl `(,(format "--ca-certificate=%s" cacert-file-body))) ,@(when (and use-ssl allow-insecure-server-cert) `("--no-check-certificate")) ,@(cond ((not use-proxy) '("--no-proxy")) ((and use-proxy proxy-server proxy-port proxy-user proxy-password) `(,(format "--proxy-user=%s" proxy-user) ,(format "--proxy-password=%s" proxy-password))) (t nil)) ,@(when (string= "POST" method) `(,(concat "--post-data=" (or post-body "")))) ,uri)) (coding-system-for-read 'binary) (coding-system-for-write 'binary) (default-directory ;; If `use-ssl' is non-nil, the `wget' process ;; is executed at the same directory as the temporary cert file. ;; Without changing directory, `wget' misses the cert file if ;; you use Emacs on Cygwin because the path on Emacs differs ;; from Windows. ;; With changing directory, `wget' on Windows can find the cert ;; file if you use Emacs on Cygwin. (if use-ssl cacert-file-base-directory default-directory)) (process-environment `(,@(when (and use-proxy proxy-server proxy-port) `(,(format "%s_proxy=%s://%s:%s/" scheme scheme proxy-server proxy-port))) ,@process-environment))) (twittering-start-process-with-sentinel name buffer twittering-wget-program args sentinel))) (defun twittering-pre-process-buffer-wget (proc buffer connection-info) (with-current-buffer buffer (save-excursion (goto-char (point-min)) (when (search-forward-regexp "\\`[^\n]*?\r\r\n" (point-max) t) ;; When `wget.exe' writes HTTP response in text mode, ;; CRLF may be converted into CRCRLF. (goto-char (point-min)) (while (search-forward "\r\n" nil t) (replace-match "\n" nil t))) (goto-char (point-max)) (when (search-backward-regexp "\nProcess [^\n]* finished\n\\'" (point-min) t) (replace-match "" nil t)) ))) ;;;; ;;;; Basic HTTP functions with url library ;;;; (defun twittering-start-http-session-urllib-p () "Return t if url library is available, otherwise nil." (require 'url nil t)) (defun twittering-start-http-session-urllib-https-p () "Return t if url library can be used for HTTPS, otherwise nil." (and (not twittering-proxy-use) (require 'url nil t) (cond ((<= 22 emacs-major-version) ;; On Emacs22 and later, `url' requires `tls'. (twittering-start-http-session-native-tls-p)) ((require 'ssl nil t) ;; On Emacs21, `url' requires `ssl'. t) ((or (and (fboundp 'open-ssl-stream) ;; Since `url-gw' (required by `url') defines autoload of ;; `open-ssl-stream' from "ssl", ;; (fboundp 'open-ssl-stream) will be non-nil even if ;; "ssl" cannot be loaded and `open-ssl-stream' is ;; unavailable. ;; Here, the availability is confirmed by `documentation'. (documentation 'open-ssl-stream)) ;; On Emacs21, `url' requires `ssl' in order to use ;; `open-ssl-stream', which is included in `ssl.el'. ;; Even if `ssl' cannot be loaded, `open-tls-stream' can be ;; used as an alternative of the function. (and (twittering-start-http-session-native-tls-p) (defalias 'open-ssl-stream 'open-tls-stream))) (provide 'ssl) t) (t nil)))) (defun twittering-send-http-request-urllib (name buffer connection-info sentinel) (let* ((request (cdr (assq 'request connection-info))) (method (cdr (assq 'method request))) (scheme (cdr (assq 'scheme request))) (uri (cdr (assq 'uri request))) (header-list (cdr (assq 'header-list request))) (post-body (cdr (assq 'post-body request))) (use-proxy (cdr (assq 'use-proxy connection-info))) (proxy-server (cdr (assq 'proxy-server connection-info))) (proxy-port (cdr (assq 'proxy-port connection-info))) (proxy-user (cdr (assq 'proxy-user connection-info))) (proxy-password (cdr (assq 'proxy-password connection-info))) (proxy-credentials (when (and proxy-user proxy-password) (concat "Basic " (base64-encode-string (concat proxy-user ":" proxy-password))))) (coding-system-for-read 'binary) (coding-system-for-write 'binary) (url-proxy-services (when use-proxy `((,scheme . ,(format "%s:%s" proxy-server proxy-port))))) (url-request-method method) (url-request-extra-headers ;; Remove some headers that should be configured by url library. ;; They may break redirections by url library because ;; `url-request-extra-headers' overwrites the new headers ;; that are adapted to redirected connection. (apply 'append (mapcar (lambda (pair) (if (member (car pair) '("Host" "Content-Length")) nil `(,pair))) (if proxy-credentials (cons `("Proxy-Authorization" ,proxy-credentials) header-list) header-list)))) (url-request-data post-body) (url-show-status twittering-url-show-status) (url-http-attempt-keepalives nil) (tls-program twittering-tls-program) (coding-system-for-read 'binary) (coding-system-for-write 'binary)) (lexical-let ((sentinel sentinel) (buffer buffer)) (let ((result-buffer (url-retrieve uri (lambda (&rest args) (let ((proc url-http-process) (url-buffer (current-buffer)) (status-str (if (and (< emacs-major-version 22) (boundp 'url-http-end-of-headers) url-http-end-of-headers) "urllib-finished" "finished"))) ;; Callback may be called multiple times. ;; (as filter and sentinel?) (unless (local-variable-if-set-p 'twittering-retrieved) (set (make-local-variable 'twittering-retrieved) 'not-completed) (with-current-buffer buffer (set-buffer-multibyte nil) (insert-buffer-substring url-buffer)) (set-process-buffer proc buffer) (unwind-protect (apply sentinel proc status-str nil) (set-process-buffer proc url-buffer) (if (eq twittering-retrieved 'exited) (url-mark-buffer-as-dead url-buffer) (setq twittering-retrieved 'completed)))) (when (memq (process-status proc) '(nil closed exit failed signal)) ;; Mark `url-buffer' as dead when the process exited ;; and `sentinel' is completed. ;; If this `lambda' is evaluated via a filter, the ;; process may exit before it is finished to evaluate ;; `(apply sentinel ...)'. In the case, `buffer' should ;; not be killed. It should be killed after the ;; evaluation of `sentinel'. (if (eq twittering-retrieved 'completed) (url-mark-buffer-as-dead url-buffer) (setq twittering-retrieved 'exited)))))))) (when (buffer-live-p result-buffer) (with-current-buffer result-buffer (set (make-local-variable 'url-show-status) twittering-url-show-status) ;; Make `url-http-attempt-keepalives' buffer-local ;; in order to send the current value of the variable ;; to the sentinel invoked for HTTP redirection, (make-local-variable 'url-http-attempt-keepalives)) (get-buffer-process result-buffer)))))) (defun twittering-pre-process-buffer-urllib (proc buffer connection-info) (with-current-buffer buffer (save-excursion (goto-char (point-max)) (cond ((search-backward-regexp "- Peer has closed the GNUTLS connection\r?\n\\'" nil t) (let ((beg (match-beginning 0)) (end (match-end 0))) (delete-region beg end))) ((search-backward-regexp "closed\r?\n\\'" nil t) (let ((beg (match-beginning 0)) (end (match-end 0))) (delete-region beg end))) (t nil))))) ;;;; ;;;; HTTP functions for twitter-like serivce ;;;; (defun twittering-http-application-headers (&optional method headers) "Return an assoc list of HTTP headers for twittering-mode." (unless method (setq method "GET")) (let ((headers headers)) (push (cons "User-Agent" (twittering-user-agent)) headers) (when (string= "GET" method) (push (cons "Accept" (concat "text/xml" ",application/xml" ",application/xhtml+xml" ",application/html;q=0.9" ",text/plain;q=0.8" ",image/png,*/*;q=0.5")) headers) (push (cons "Accept-Charset" "utf-8;q=0.7,*;q=0.7") headers)) (when (string= "POST" method) (push (cons "Content-Type" "text/plain") headers)) headers )) (defun twittering-add-application-header-to-http-request (request account-info) "Make a new HTTP request based on REQUEST with the authorization header. The authorization header is generated from ACCOUNT-INFO. ACCOUNT-INFO must be an alist that includes the following keys; \"screen_name\" and \"password\" if `twittering-auth-method' is 'basic, \"screen_name\", \"oauth_token\" and \"oauth_token_secret\" if `twittering-auth-method' is 'oauth or 'xauth." (let* ((method (cdr (assq 'method request))) (auth-str (cond ((eq twittering-auth-method 'basic) (twittering-make-basic-authentication-string account-info)) ((memq twittering-auth-method '(oauth xauth)) (twittering-make-oauth-authentication-string account-info request)) (t nil))) (cookie-str (twittering-make-cookie-string request account-info)) (application-headers `(,@(twittering-http-application-headers method) ("Authorization" . ,auth-str) ,@(when cookie-str `(("Cookie" . ,cookie-str)))))) (mapcar (lambda (entry) (if (eq (car entry) 'header-list) `(header-list . ,(append (cdr entry) application-headers)) entry)) request))) (defun twittering-get-error-message (header-info connection-info &optional buffer) "Return an error message generated from the arguments. HEADER-INFO must be an alist generated by `twittering-get-response-header'. CONNECTION-INFO must be an alist generated by `twittering-make-connection-info'. It may include some additional information which is added by `twittering-send-http-request'. BUFFER must be nil or a HTTP response body, which includes error messages from the server when the HTTP status code equals to 400 or 403. If BUFFER is nil, the current buffer is used instead." (let ((buffer (or buffer (current-buffer))) (status-line (cdr (assq 'status-line header-info))) (status-code (cdr (assq 'status-code header-info))) (format (twittering-get-content-subtype-symbol-from-header-info header-info))) (cond ((and (buffer-live-p buffer) (member status-code '("400" "401" "403" "404"))) ;; Twitter returns an error message as a HTTP response body if ;; HTTP status is "400 Bad Request" or "403 Forbidden". ;; See "HTTP Response Codes and Errors | dev.twitter.com" ;; http://dev.twitter.com/pages/responses_errors . ;; ;; However, Twitter seems to return an error message even when ;; the HTTP status is "401 Unauthorized" or "404 Not Found". (let* ((error-mes (cond ((eq format 'xml) (let ((xmltree (with-current-buffer buffer (twittering-xml-parse-region (point-min) (point-max))))) (car (cddr (assq 'error (or (assq 'errors xmltree) (assq 'hash xmltree))))))) ((eq format 'json) (let ((json-object (with-current-buffer buffer (twittering-json-read)))) (cdr (assq 'error json-object)))) (t ;; ATOM is not supported. nil)))) (if error-mes (format "%s (%s)" status-line error-mes) status-line))) (t status-line)))) (defun twittering-http-get (account-info-alist host method &optional parameters format additional-info sentinel clean-up-sentinel) "Send a HTTP GET request with application headers. ACCOUNT-INFO-ALIST is an alist used by `twittering-add-application-header-to-http-request'. The alist made by `((account-info . ,ACCOUNT-INFO-ALIST) ,@ADDITIONAL-INFO)' is used as the argument `additional-info' of `twittering-send-http-request'. HOST is hostname of remote side, api.twitter.com (or search.twitter.com). METHOD must be one of Twitter API method classes (statuses, users or direct_messages). PARAMETERS is alist of URI parameters. ex) ((\"mode\" . \"view\") (\"page\" . \"6\")) => ?mode=view&page=6 FORMAT is a response data format (\"xml\", \"atom\", \"json\")" (let* ((format (or format "xml")) (sentinel (lexical-let ((sentinel (or sentinel 'twittering-http-get-default-sentinel))) (lambda (proc status connection-info header-info) (twittering-update-server-info connection-info header-info) (apply sentinel proc status connection-info header-info nil)))) (path (concat "/" method "." format)) (headers nil) (port nil) (post-body "") (request (twittering-add-application-header-to-http-request (twittering-make-http-request "GET" headers host port path parameters post-body twittering-use-ssl) account-info-alist)) (additional-info `((account-info . ,account-info-alist) ,@additional-info))) (twittering-send-http-request request additional-info sentinel clean-up-sentinel))) (defun twittering-http-get-default-sentinel (proc status connection-info header-info) (let ((status-line (cdr (assq 'status-line header-info))) (status-code (cdr (assq 'status-code header-info))) (format (twittering-get-content-subtype-symbol-from-header-info header-info))) (case-string status-code (("200") (debug-printf "connection-info=%s" connection-info) (let* ((spec (cdr (assq 'timeline-spec connection-info))) (spec-string (cdr (assq 'timeline-spec-string connection-info))) (service-method (cdr (assq 'service-method connection-info))) (statuses (cond ((eq format 'json) (let ((json-array (twittering-json-read))) (cond ((null json-array) nil) ((eq (car spec) 'search) (cond ((memq service-method '(twitter statusnet)) (mapcar 'twittering-json-object-to-a-status-on-search (cdr (assq 'results json-array)))) ((eq service-method 'twitter-api-v1.1) (mapcar 'twittering-json-object-to-a-status (cdr (assq 'statuses json-array)))))) ((twittering-timeline-spec-is-direct-messages-p spec) (mapcar 'twittering-json-object-to-a-status-on-direct-messages json-array)) (t (mapcar 'twittering-json-object-to-a-status json-array))))) ((eq format 'xml) (let ((xmltree (twittering-xml-parse-region (point-min) (point-max)))) (when xmltree (twittering-xmltree-to-status xmltree)))) ((eq format 'atom) (let ((xmltree (twittering-xml-parse-region (point-min) (point-max)))) (when xmltree (twittering-atom-xmltree-to-status xmltree)))) (t nil))) (rendered-tweets nil)) (let ((updated-timeline-info (twittering-add-statuses-to-timeline-data statuses spec)) (buffer (twittering-get-buffer-from-spec spec))) ;; FIXME: We should retrieve un-retrieved statuses until ;; statuses is nil. twitter server returns nil as ;; xmltree with HTTP status-code is "200" when we ;; retrieved all un-retrieved statuses. (if twittering-notify-successful-http-get (if updated-timeline-info (concat (format "Fetching %s. Success. " spec-string) (mapconcat (lambda (info) (let ((spec-string (nth 0 info)) (num (nth 1 info))) (format "%s: +%d" spec-string num))) updated-timeline-info ", ")) (format "Fetching %s. Success. (No new tweets)" spec-string)) nil)))) (("404") ;; The requested resource does not exist. (let ((spec (cdr (assq 'timeline-spec connection-info))) (spec-string (cdr (assq 'timeline-spec-string connection-info)))) ;; Remove specs related to the invalid spec from history. (mapc (lambda (buffer) (let ((other-spec (twittering-get-timeline-spec-for-buffer buffer)) (other-spec-string (twittering-get-timeline-spec-string-for-buffer buffer))) (when (twittering-timeline-spec-depending-on-p other-spec spec) (twittering-remove-timeline-spec-string-from-history other-spec-string)))) (twittering-get-buffer-list))) (format "Response: %s" (twittering-get-error-message header-info connection-info))) (t (format "Response: %s" (twittering-get-error-message header-info connection-info)))))) (defun twittering-retrieve-single-tweet-sentinel (proc status connection-info header-info) (let ((status-line (cdr (assq 'status-line header-info))) (status-code (cdr (assq 'status-code header-info))) (format (twittering-get-content-subtype-symbol-from-header-info header-info))) (case-string status-code (("200" "403" "404") (debug-printf "connection-info=%s" connection-info) (let* ((id (cdr (assq 'id connection-info))) (user-screen-name (cdr (assq 'user-screen-name connection-info))) (status (cond ((string= status-code "403") ;; Forbidden. Maybe a protected tweet? (twittering-make-alist-of-forbidden-tweet id user-screen-name)) ((string= status-code "404") ;; The requested resource does not exist. (twittering-make-alist-of-non-existent-tweet id user-screen-name)) ((eq format 'json) (let ((json-object (twittering-json-read))) (twittering-json-object-to-a-status json-object))) ((eq format 'xml) (let ((xmltree (twittering-xml-parse-region (point-min) (point-max)))) (when xmltree (car (twittering-xmltree-to-status `((statuses nil ,@xmltree))))))) (t nil)))) (when status (twittering-add-statuses-to-timeline-data `(,status) '(:single)) (let ((buffer (cdr (assq 'buffer connection-info))) (spec (cdr (assq 'timeline-spec connection-info))) (prop (cdr (assq 'property-to-be-redisplayed connection-info)))) (cond ((null prop) ;; The process has been invoked via `twittering-call-api' with ;; the command `retrieve-timeline', not the command ;; `retrieve-single-tweet' for rendering a replied tweet. ;; No special property that specifies regions being re-rendered ;; is given. (let ((new-statuses `(,status)) (buffer (twittering-get-buffer-from-spec spec))) (when (and new-statuses buffer) (twittering-render-timeline buffer new-statuses t)))) ((and buffer prop (buffer-live-p buffer)) (twittering-redisplay-status-on-each-buffer buffer prop) (with-current-buffer buffer (save-excursion (let ((buffer-read-only nil)) (lexical-let ((prop prop)) (twittering-for-each-property-region prop (lambda (beg end value) ;; Remove the property required no longer. (remove-text-properties beg end `(,prop nil)) (goto-char beg) (twittering-render-replied-statuses))))))))))) (cond ((string= status-code "403") (format "You are not authorized to see this tweet (ID %s)." id)) ((string= status-code "404") (format "The tweet with ID %s does not exist." id)) (twittering-notify-successful-http-get (format "Fetching %s. Success." id)) (t nil)))) (t (format "Response: %s" (twittering-get-error-message header-info connection-info)))))) (defmacro twittering-http-get-list-sentinel-base (what) `(let ((status-line (cdr (assq 'status-line header-info))) (status-code (cdr (assq 'status-code header-info))) (format (twittering-get-content-subtype-symbol-from-header-info header-info)) (indexes nil) (mes nil)) (case-string status-code (("200") (cond ((eq format 'xml) (let ((xmltree (twittering-xml-parse-region (point-min) (point-max)))) (when xmltree (setq indexes (mapcar (lambda (c-node) (caddr (assq ,what c-node))) (remove nil (mapcar (lambda (node) (and (consp node) (eq 'list (car node)) node)) (cdr-safe (assq 'lists (assq 'lists_list xmltree)))) )) )))) ((eq format 'json) (let* ((json-object (twittering-json-read)) (json-list (cond ((arrayp json-object) ;; GET lists/list in the Twitter REST API v1.1 returns ;; an array. json-object) (t ;; GET lists/subscriptions in the Twitter REST API v1.1 ;; returns an alist. (cdr (assq 'lists json-object)))))) (when json-object (setq indexes (mapcar (lambda (entry) (cdr (assq ,what entry))) json-list))))) (t (error "Format \"%s\" is not supported" format) nil))) (t (setq mes (format "Response: %s" (twittering-get-error-message header-info connection-info))))) (setq twittering-list-index-retrieved (or indexes mes "")) ;; set "" explicitly if user does not have a list. mes)) (defun twittering-http-get-list-index-sentinel (proc status connection-info header-info) (twittering-http-get-list-sentinel-base 'slug)) (defun twittering-http-get-list-subscriptions-sentinel (proc status connection-info header-info) (let ((result (twittering-http-get-list-sentinel-base 'full_name))) (when (listp twittering-list-index-retrieved) (setq twittering-list-index-retrieved (mapcar (lambda (str) (and (string-match "\\`@\\(.*\\)\\'" str) (match-string 1 str))) twittering-list-index-retrieved))) result)) (defun twittering-http-post (account-info-alist host method &optional parameters format additional-info sentinel clean-up-sentinel) "Send HTTP POST request to api.twitter.com (or search.twitter.com) ACCOUNT-INFO-ALIST is an alist used by `twittering-add-application-header-to-http-request'. The alist made by `((account-info . ,ACCOUNT-INFO-ALIST) ,@ADDITIONAL-INFO)' is used as the argument `additional-info' of `twittering-send-http-request'. HOST is hostname of remote side, api.twitter.com (or search.twitter.com). METHOD must be one of Twitter API method classes (statuses, users or direct_messages). PARAMETERS is alist of URI parameters. ex) ((\"mode\" . \"view\") (\"page\" . \"6\")) => ?mode=view&page=6 FORMAT is a response data format (\"xml\", \"atom\", \"json\")" (let* ((format (or format "xml")) (sentinel (lexical-let ((sentinel (or sentinel 'twittering-http-post-default-sentinel))) (lambda (proc status connection-info header-info) (twittering-update-server-info connection-info header-info) (apply sentinel proc status connection-info header-info nil)))) (path (concat "/" method "." format)) (headers nil) (port nil) (post-body "") (request (twittering-add-application-header-to-http-request (twittering-make-http-request "POST" headers host port path parameters post-body twittering-use-ssl) account-info-alist)) (additional-info `((account-info . ,account-info-alist) ,@additional-info))) (twittering-send-http-request request additional-info sentinel clean-up-sentinel))) (defun twittering-http-post-default-sentinel (proc status connection-info header-info) (let ((status-line (cdr (assq 'status-line header-info))) (status-code (cdr (assq 'status-code header-info)))) (case-string status-code (("200") "Success: Post.") (t (format "Response: %s" (twittering-get-error-message header-info connection-info)))))) (defun twittering-http-post-destroy-status-sentinel (proc status connection-info header-info) "A sentinel for deleting a status invoked via `twittering-call-api'." (let ((status-line (cdr (assq 'status-line header-info))) (status-code (cdr (assq 'status-code header-info))) (format (twittering-get-content-subtype-symbol-from-header-info header-info))) (case-string status-code (("200") (let* ((params (cond ((eq format 'xml) (let ((xml (twittering-xml-parse-region (point-min) (point-max)))) `((id . ,(elt (assq 'id (assq 'status xml)) 2)) (text . ,(elt (assq 'text (assq 'status xml)) 2))))) ((eq format 'json) (let ((json-object (twittering-json-read))) `((id . ,(cdr (assq 'id_str json-object))) (text . ,(cdr (assq 'text json-object)))))) (t (error "Format \"%s\" is not supported" format) nil))) (id (cdr (assq 'id params))) (text (cdr (assq 'text params)))) (cond (id (twittering-delete-status-from-data-table id) (format "Deleting \"%s\". Success." text)) (t "Failure: the response for deletion could not be parsed.")))) (t (format "Response: %s" (twittering-get-error-message header-info connection-info)))))) ;;;; ;;;; OAuth ;;;; (defun twittering-oauth-url-encode (str &optional coding-system) "Encode string according to Percent-Encoding defined in RFC 3986." (let ((coding-system (or (when (and coding-system (coding-system-p coding-system)) coding-system) 'utf-8))) (mapconcat (lambda (c) (cond ((or (and (<= ?A c) (<= c ?Z)) (and (<= ?a c) (<= c ?z)) (and (<= ?0 c) (<= c ?9)) (eq ?. c) (eq ?- c) (eq ?_ c) (eq ?~ c)) (char-to-string c)) (t (format "%%%02X" c)))) (encode-coding-string str coding-system) ""))) (defun twittering-oauth-unhex (c) (cond ((and (<= ?0 c) (<= c ?9)) (- c ?0)) ((and (<= ?A c) (<= c ?F)) (+ 10 (- c ?A))) ((and (<= ?a c) (<= c ?f)) (+ 10 (- c ?a))) )) (defun twittering-oauth-url-decode (str &optional coding-system) (let* ((coding-system (or (when (and coding-system (coding-system-p coding-system)) coding-system) 'utf-8)) (substr-list (split-string str "%")) (head (car substr-list)) (tail (cdr substr-list))) (decode-coding-string (concat head (mapconcat (lambda (substr) (if (string-match "\\`\\([0-9a-fA-F]\\)\\([0-9a-fA-F]\\)\\(.*\\)\\'" substr) (let* ((c1 (string-to-char (match-string 1 substr))) (c0 (string-to-char (match-string 2 substr))) (tail (match-string 3 substr)) (ch (+ (* 16 (twittering-oauth-unhex c1)) (twittering-oauth-unhex c0)))) (concat (char-to-string ch) tail)) substr)) tail "")) coding-system))) (defun twittering-oauth-make-signature-base-string (method base-url parameters) ;; "OAuth Core 1.0a" ;; http://oauth.net/core/1.0a/#anchor13 (let* ((sorted-parameters (copy-sequence parameters)) (sorted-parameters (sort sorted-parameters (lambda (entry1 entry2) (string< (car entry1) (car entry2)))))) (concat method "&" (twittering-oauth-url-encode base-url) "&" (mapconcat (lambda (entry) (let ((key (car entry)) (value (cdr entry))) (concat (twittering-oauth-url-encode key) "%3D" (twittering-oauth-url-encode value)))) sorted-parameters "%26")))) (defun twittering-oauth-make-random-string (len) (let* ((table (concat "0123456789" "ABCDEFGHIJKLMNOPQRSTUVWXYZ" "abcdefghijklmnopqrstuvwxyz")) (n (length table)) (l 0) (result (make-string len ?0))) (while (< l len) (aset result l (aref table (random n))) (setq l (1+ l))) result)) (defun twittering-sha1 (&rest args) "Return the SHA1 (Secure Hash Algorithm) of an object. This is equivalent to the function `sha1' except that `coding-system-for-read' and `coding-system-for-write' are bound to the symbol `binary'. The function `sha1' uses an external program for large object. However, the coding system for transferring data from/to the program is not fixed, at least in the implementation distributed with GNU Emacs 21.4.1, 22.2.1 and 23.2.1. Therefore, the result from the function `sha1' may depend on the current coding system. This function avoid the dependency by binding `coding-system-for-read' and `coding-system-for-write' to the symbol `binary'." (require 'sha1) (let ((coding-system-for-read 'binary) (coding-system-for-write 'binary) ;; Bind `default-directory' to the temporary directory ;; because it is possible that the directory pointed by ;; `default-directory' has been already removed. (default-directory temporary-file-directory)) (apply 'sha1 args))) ;;; ;;; The below function is derived from `hmac-sha1' retrieved ;;; from http://www.emacswiki.org/emacs/HmacShaOne. ;;; (defun twittering-hmac-sha1 (key message) "Return an HMAC-SHA1 authentication code for KEY and MESSAGE. KEY and MESSAGE must be unibyte strings. The result is a unibyte string. Use the function `encode-hex-string' or the function `base64-encode-string' to produce human-readable output. See URL: for more information on the HMAC-SHA1 algorithm. The Emacs multibyte representation actually uses a series of 8-bit values under the hood, so we could have allowed multibyte strings as arguments. However, internal 8-bit values don't correspond to any external representation \(at least for major version 22). This makes multibyte strings useless for generating hashes. Instead, callers must explicitly pick and use an encoding for their multibyte data. Most callers will want to use UTF-8 encoding, which we can generate as follows: (let ((unibyte-key (encode-coding-string key 'utf-8 t)) (unibyte-value (encode-coding-string value 'utf-8 t))) (twittering-hmac-sha1 unibyte-key unibyte-value)) For keys and values that are already unibyte, the `encode-coding-string' calls just return the same string." ;;; Return an HMAC-SHA1 authentication code for KEY and MESSAGE. ;;; ;;; KEY and MESSAGE must be unibyte strings. The result is a unibyte ;;; string. Use the function `encode-hex-string' or the function ;;; `base64-encode-string' to produce human-readable output. ;;; ;;; See URL: for more information ;;; on the HMAC-SHA1 algorithm. ;;; ;;; The Emacs multibyte representation actually uses a series of ;;; 8-bit values under the hood, so we could have allowed multibyte ;;; strings as arguments. However, internal 8-bit values don't ;;; correspond to any external representation \(at least for major ;;; version 22). This makes multibyte strings useless for generating ;;; hashes. ;;; ;;; Instead, callers must explicitly pick and use an encoding for ;;; their multibyte data. Most callers will want to use UTF-8 ;;; encoding, which we can generate as follows: ;;; ;;; (let ((unibyte-key (encode-coding-string key 'utf-8 t)) ;;; (unibyte-value (encode-coding-string value 'utf-8 t))) ;;; (hmac-sha1 unibyte-key unibyte-value)) ;;; ;;; For keys and values that are already unibyte, the ;;; `encode-coding-string' calls just return the same string. ;;; ;;; Author: Derek Upham - sand (at) blarg.net ;;; ;;; Copyright: This code is in the public domain. (require 'sha1) (when (multibyte-string-p key) (error "key must be unibyte")) (when (multibyte-string-p message) (error "message must be unibyte")) ;; The key block is always exactly the block size of the hash ;; algorithm. If the key is too small, we pad it with zeroes (or ;; instead, we initialize the key block with zeroes and copy the ;; key onto the nulls). If the key is too large, we run it ;; through the hash algorithm and use the hashed value (strange ;; but true). (let ((+hmac-sha1-block-size-bytes+ 64)) ; SHA-1 uses 512-bit blocks (when (< +hmac-sha1-block-size-bytes+ (length key)) (setq key (twittering-sha1 key nil nil t))) (let ((key-block (make-vector +hmac-sha1-block-size-bytes+ 0))) (dotimes (i (length key)) (aset key-block i (aref key i))) (let ((opad (make-vector +hmac-sha1-block-size-bytes+ #x5c)) (ipad (make-vector +hmac-sha1-block-size-bytes+ #x36))) (dotimes (i +hmac-sha1-block-size-bytes+) (aset ipad i (logxor (aref ipad i) (aref key-block i))) (aset opad i (logxor (aref opad i) (aref key-block i)))) (when (fboundp 'unibyte-string) ;; `concat' of Emacs23 (and later?) generates a multi-byte ;; string from a vector of characters with eight bit. ;; Since `opad' and `ipad' must be unibyte, we have to ;; convert them by using `unibyte-string'. ;; We cannot use `string-as-unibyte' here because it encodes ;; bytes with the manner of UTF-8. (setq opad (apply 'unibyte-string (mapcar 'identity opad))) (setq ipad (apply 'unibyte-string (mapcar 'identity ipad)))) (twittering-sha1 (concat opad (twittering-sha1 (concat ipad message) nil nil t)) nil nil t))))) (defun twittering-oauth-auth-str (method base-url query-parameters oauth-parameters key) "Generate the value for HTTP Authorization header on OAuth. QUERY-PARAMETERS is an alist for query parameters, where name and value must be encoded into the same as they will be sent." (let* ((parameters (append query-parameters oauth-parameters)) (base-string (twittering-oauth-make-signature-base-string method base-url parameters)) (key (if (multibyte-string-p key) (string-make-unibyte key) key)) (base-string (if (multibyte-string-p base-string) (string-make-unibyte base-string) base-string)) (signature (base64-encode-string (twittering-hmac-sha1 key base-string)))) (concat "OAuth " (mapconcat (lambda (entry) (concat (car entry) "=\"" (cdr entry) "\"")) oauth-parameters ",") ",oauth_signature=\"" (twittering-oauth-url-encode signature) "\""))) (defun twittering-oauth-auth-str-request-token (url query-parameters consumer-key consumer-secret &optional oauth-parameters) (let ((key (concat consumer-secret "&")) (oauth-params (or oauth-parameters `(("oauth_nonce" . ,(twittering-oauth-make-random-string 43)) ("oauth_callback" . "oob") ("oauth_signature_method" . "HMAC-SHA1") ("oauth_timestamp" . ,(format-time-string "%s")) ("oauth_consumer_key" . ,consumer-key) ("oauth_version" . "1.0"))))) (twittering-oauth-auth-str "POST" url query-parameters oauth-params key))) (defun twittering-oauth-auth-str-exchange-token (url query-parameters consumer-key consumer-secret request-token request-token-secret verifier &optional oauth-parameters) (let ((key (concat consumer-secret "&" request-token-secret)) (oauth-params (or oauth-parameters `(("oauth_consumer_key" . ,consumer-key) ("oauth_nonce" . ,(twittering-oauth-make-random-string 43)) ("oauth_signature_method" . "HMAC-SHA1") ("oauth_timestamp" . ,(format-time-string "%s")) ("oauth_version" . "1.0") ("oauth_token" . ,request-token) ("oauth_verifier" . ,verifier))))) (twittering-oauth-auth-str "POST" url query-parameters oauth-params key))) (defun twittering-oauth-auth-str-access (method url query-parameters consumer-key consumer-secret access-token access-token-secret &optional oauth-parameters) "Generate a string for Authorization in HTTP header on OAuth. METHOD means HTTP method such as \"GET\", \"POST\", etc. URL means a simple URL without port number and query parameters. QUERY-PARAMETERS means an alist of query parameters such as '((\"status\" . \"test%20tweet\") (\"in_reply_to_status_id\" . \"12345678\")), where name and value must be encoded into the same as they will be sent. CONSUMER-KEY and CONSUMER-SECRET specifies the consumer. ACCESS-TOKEN and ACCESS-TOKEN-SECRET must be authorized before calling this function." (let ((key (concat consumer-secret "&" access-token-secret)) (oauth-params (or oauth-parameters `(("oauth_consumer_key" . ,consumer-key) ("oauth_nonce" . ,(twittering-oauth-make-random-string 43)) ("oauth_signature_method" . "HMAC-SHA1") ("oauth_timestamp" . ,(format-time-string "%s")) ("oauth_version" . "1.0") ("oauth_token" . ,access-token))))) (twittering-oauth-auth-str method url query-parameters oauth-params key))) ;; "Using xAuth | dev.twitter.com" ;; http://dev.twitter.com/pages/xauth (defun twittering-xauth-auth-str-access-token (url query-parameters consumer-key consumer-secret username password &optional oauth-parameters) (let ((key (concat consumer-secret "&")) (oauth-params (or oauth-parameters `(("oauth_nonce" . ,(twittering-oauth-make-random-string 43)) ("oauth_signature_method" . "HMAC-SHA1") ("oauth_timestamp" . ,(format-time-string "%s")) ("oauth_consumer_key" . ,consumer-key) ("oauth_version" . "1.0")))) (query-params (append query-parameters `(("x_auth_mode" . "client_auth") ("x_auth_password" . ,(twittering-oauth-url-encode password)) ("x_auth_username" . ,(twittering-oauth-url-encode username)))))) (twittering-oauth-auth-str "POST" url query-params oauth-params key))) ;; "OAuth Core 1.0a" ;; http://oauth.net/core/1.0a/#response_parameters (defun twittering-oauth-make-response-alist (str) (mapcar (lambda (entry) (let* ((pair (split-string entry "=")) (name-entry (car pair)) (value-entry (cadr pair)) (name (and name-entry (twittering-oauth-url-decode name-entry))) (value (and value-entry (twittering-oauth-url-decode value-entry)))) `(,name . ,value))) (split-string str "&"))) (defun twittering-oauth-get-response-alist (buffer) (with-current-buffer buffer (goto-char (point-min)) (when (search-forward-regexp "\\`\\(\\(HTTP/1\\.[01]\\|HTTP/2\\(?:\\.0\\)?\\) \\([0-9][0-9][0-9]\\)\\(.*?\\)\\)\r?\n" nil t) (let ((status-line (match-string 1)) (http-version (match-string 2)) (status-code (match-string 3)) (reason-phrase (match-string 4))) (cond ((not (string-match "2[0-9][0-9]" status-code)) (message "Response: %s" status-line) nil) ((search-forward-regexp "\r?\n\r?\n" nil t) (let ((beg (match-end 0)) (end (point-max))) (twittering-oauth-make-response-alist (buffer-substring beg end)))) (t (message "Response: %s" status-line) nil)))))) (defun twittering-oauth-get-token-alist-url (url auth-str post-body) (let* ((url-request-method "POST") (url-request-extra-headers `(("Authorization" . ,auth-str) ("Accept-Charset" . "us-ascii") ("Content-Type" . "application/x-www-form-urlencoded") ("Content-Length" . ,(format "%d" (length post-body))))) (url-request-data post-body) (coding-system-for-read 'utf-8-unix)) (lexical-let ((result 'queried)) (let ((buffer (url-retrieve url (lambda (&rest args) (let* ((status (if (< 21 emacs-major-version) (car args) nil)) (callback-args (if (< 21 emacs-major-version) (cdr args) args)) (response-buffer (current-buffer))) (setq result (twittering-oauth-get-response-alist response-buffer)) ))))) (while (eq result 'queried) (sleep-for 0.1)) (unless twittering-debug-mode (kill-buffer buffer)) result)))) (defun twittering-oauth-get-token-alist (url auth-str &optional post-body) (let ((request (twittering-make-http-request-from-uri "POST" `(("Authorization" . ,auth-str) ("Accept-Charset" . "us-ascii") ("Content-Type" . "application/x-www-form-urlencoded")) url post-body))) (lexical-let ((result 'queried)) (let ((proc (twittering-send-http-request request nil (lambda (proc status connection-info header-info) (let ((status-line (cdr (assq 'status-line header-info))) (status-code (cdr (assq 'status-code header-info)))) (case-string status-code (("200") (when twittering-debug-mode (let ((buffer (current-buffer))) (with-current-buffer (twittering-debug-buffer) (insert-buffer-substring buffer)))) (setq result (twittering-oauth-make-response-alist (buffer-string))) nil) (t (setq result nil) (format "Response: %s" status-line))))) (lambda (proc status connection-info) (when (and (not (twittering-process-alive-p proc)) (eq result 'queried)) (setq result nil)))))) (twittering-wait-while nil 0.1 (and (eq result 'queried) (twittering-process-alive-p proc))) (when (and (eq result 'queried) (not (twittering-process-alive-p proc))) ;; If the process has been dead, wait a moment because ;; Emacs may be in the middle of evaluating the sentinel. (twittering-wait-while 10 0.1 (eq result 'queried) nil (setq result nil))) result)))) (defun twittering-oauth-get-request-token (url consumer-key consumer-secret) (let ((auth-str (twittering-oauth-auth-str-request-token url nil consumer-key consumer-secret))) (twittering-oauth-get-token-alist url auth-str))) (defun twittering-oauth-exchange-request-token (url consumer-key consumer-secret request-token request-token-secret verifier) (let ((auth-str (twittering-oauth-auth-str-exchange-token url nil consumer-key consumer-secret request-token request-token-secret verifier))) (twittering-oauth-get-token-alist url auth-str))) (defun twittering-oauth-get-access-token (request-token-url authorize-url-func access-token-url consumer-key consumer-secret consumer-name) "Return an alist of authorized access token. The function retrieves a request token from the site specified by REQUEST-TOKEN-URL. Then, The function asks a WWW browser to authorize the token by calling `browse-url'. The URL for authorization is calculated by calling AUTHORIZE-URL-FUNC with the request token as an argument. AUTHORIZE-URL-FUNC is called as `(funcal AUTHORIZE-URL-FUNC request-token)', where the request-token is a string. After calling `browse-url', the function waits for user to input the PIN code that is displayed in the browser. The request token is authorized by the PIN code, and then it is exchanged for the access token on the site specified by ACCESS-TOKEN-URL. CONSUMER-KEY and CONSUMER-SECRET specify the consumer. CONSUMER-NAME is displayed at the guide of authorization. The access token is returned as a list of a cons pair of name and value like following: ((\"oauth_token\" . \"819797-Jxq8aYUDRmykzVKrgoLhXSq67TEa5ruc4GJC2rWimw\") (\"oauth_token_secret\" . \"J6zix3FfA9LofH0awS24M3HcBYXO5nI1iYe8EfBA\") (\"user_id\" . \"819797\") (\"screen_name\" . \"episod\")) ." (let* ((request-token-alist (twittering-oauth-get-request-token request-token-url consumer-key consumer-secret)) (request-token (cdr (assoc "oauth_token" request-token-alist))) (request-token-secret (cdr (assoc "oauth_token_secret" request-token-alist))) (authorize-url (funcall authorize-url-func request-token)) (str (concat (propertize "Authorization via OAuth\n" 'face 'bold) "\n" "1.Allow access by " consumer-name " on the below site.\n" "\n " (propertize authorize-url 'url authorize-url 'face 'bold) "\n" "\n" (when twittering-oauth-invoke-browser (concat " Emacs invokes your browser by the function `browse-url'.\n" " If the site is not opened automatically, you have to open\n" " the site manually.\n" "\n")) "2.After allowing access, the site will display the PIN code." "\n" " Input the PIN code " (propertize "at the below minibuffer." 'face 'bold)))) (cond (request-token-alist (with-temp-buffer (switch-to-buffer (current-buffer)) (let* ((str-height (length (split-string str "\n"))) (height (max 0 (- (/ (- (window-text-height) 1) 2) (/ str-height 2))))) (insert (make-string height ?\n) str) (if twittering-oauth-invoke-browser (browse-url authorize-url) (when (y-or-n-p "Open authorization URL with browser? (using `browse-url')") (browse-url authorize-url))) (let* ((pin (block pin-input-block (while t (let ((pin-input (read-string "Input PIN code: "))) (when (string-match "^\\s-*\\([0-9]+\\)\\s-*$" pin-input) (return-from pin-input-block (match-string 1 pin-input))))))) (verifier pin)) (twittering-oauth-exchange-request-token access-token-url consumer-key consumer-secret request-token request-token-secret verifier))))) (t (error "Failed to retrieve a request token") nil)))) (defun twittering-xauth-get-access-token (access-token-url consumer-key consumer-secret username password) (let ((auth-str (twittering-xauth-auth-str-access-token access-token-url nil consumer-key consumer-secret username password)) (post-body (mapconcat (lambda (pair) (format "%s=%s" (car pair) (twittering-oauth-url-encode (cdr pair)))) `(("x_auth_mode" . "client_auth") ("x_auth_password" . ,password) ("x_auth_username" . ,username)) "&"))) (twittering-oauth-get-token-alist access-token-url auth-str post-body))) ;;;; ;;;; Private storage ;;;; (defun twittering-private-info-loaded-p () twittering-private-info-file-loaded) (defun twittering-load-private-info () (let* ((file twittering-private-info-file) (decrypted-str (twittering-read-from-encrypted-file file)) (loaded-alist (when decrypted-str (condition-case nil (read decrypted-str) (error nil))))) (when loaded-alist (remove nil (mapcar (lambda (pair) (when (consp pair) (let ((sym (car pair)) (value (cdr pair))) (cond ((memq sym twittering-variables-stored-with-encryption) (set sym value) sym) (t nil))))) loaded-alist))))) (defun twittering-load-private-info-with-guide () (let ((str (concat "Loading authorized access token for OAuth from\n" (format "%s.\n" twittering-private-info-file) "\n" (propertize "Please input the master password.\n" 'face 'bold) "\n" "To cancel it, you may need to press C-g multiple times.\n" ))) (with-temp-buffer (switch-to-buffer (current-buffer)) (let* ((str-height (length (split-string str "\n"))) (height (max 0 (- (/ (- (window-text-height) 1) 2) (/ str-height 2))))) (insert (make-string height ?\n) str) (set-buffer-modified-p nil) (twittering-load-private-info))))) (defun twittering-save-private-info () (let* ((obj (mapcar (lambda (sym) `(,sym . ,(symbol-value sym))) twittering-variables-stored-with-encryption)) (str (with-output-to-string (pp obj))) (file twittering-private-info-file)) (when (twittering-write-and-encrypt file str) (set-file-modes file #o600) (setq twittering-private-info-file-loaded t)))) (defun twittering-save-private-info-with-guide () (let ((str (concat "Saving authorized access token for OAuth to " (format "%s.\n" twittering-private-info-file) "\n" (propertize "Please input a master password twice." 'face 'bold)))) (with-temp-buffer (switch-to-buffer (current-buffer)) (let* ((str-height (length (split-string str "\n"))) (height (max 0 (- (/ (- (window-text-height) 1) 2) (/ str-height 2))))) (insert (make-string height ?\n) str) (set-buffer-modified-p nil) (twittering-save-private-info))))) (defun twittering-capable-of-encryption-p () (and (or (require 'epa nil t) (require 'alpaca nil t)) (executable-find "gpg"))) (eval-when-compile (require 'epa nil t) (require 'alpaca nil t)) (defun twittering-read-from-encrypted-file (file) "Decrypt contents from FILE and return them. Read encrypted contents from FILE and return the decrypted contents. This function requires `epa' or `alpaca' library." (cond ((not (file-readable-p file)) (error "Failed to read %s" file) nil) ((require 'epa nil t) (let ((context (epg-make-context epa-protocol)) ;; Bind `default-directory' to the temporary directory ;; because it is possible that the directory pointed by ;; `default-directory' has been already removed. (default-directory temporary-file-directory)) (epg-context-set-passphrase-callback context #'epa-passphrase-callback-function) (epg-context-set-progress-callback context (cons #'epa-progress-callback-function (format "Decrypting %s..." (file-name-nondirectory file)))) (message "Decrypting %s..." (file-name-nondirectory file)) (condition-case err (let ((full-path (expand-file-name file))) ;; `epg-decrypt-file' included in EasyPG 1.0.0, which is ;; distributed with Emacs 23.2, requires the expanded full path ;; as the argument CIPHER. This is because CIPHER is directly ;; used as an argument of the command `gpg'. (epg-decrypt-file context full-path nil)) (error (message "%s" (cdr err)) nil)))) ((require 'alpaca nil t) (with-temp-buffer (let ((buffer-file-name (expand-file-name file)) (alpaca-regex-suffix ".*") (coding-system-for-read 'binary) (coding-system-for-write 'binary) (temp-buffer (current-buffer)) ;; Bind `default-directory' to the temporary directory ;; because it is possible that the directory pointed by ;; `default-directory' has been already removed. (default-directory temporary-file-directory)) (insert-file-contents-literally file) (set-buffer-modified-p nil) (condition-case nil (progn (alpaca-after-find-file) (if (eq temp-buffer (current-buffer)) (buffer-string) ;; `alpaca-after-find-file' kills the current buffer ;; if the decryption is failed. nil)) (error (when (eq temp-buffer (current-buffer)) (delete-region (point-min) (point-max))) nil))))) (t nil))) (defun twittering-write-and-encrypt (file str) (cond ((require 'epg nil t) (let ((context (epg-make-context epa-protocol)) ;; Bind `default-directory' to the temporary directory ;; because it is possible that the directory pointed by ;; `default-directory' has been already removed. (default-directory temporary-file-directory)) (epg-context-set-passphrase-callback context #'epa-passphrase-callback-function) (epg-context-set-progress-callback context (cons #'epa-progress-callback-function "Encrypting...")) (message "Encrypting...") (condition-case err (unwind-protect ;; In order to prevent `epa-file' to encrypt the file double, ;; `epa-file-name-regexp' is temorarily changed into the null ;; regexp that never matches any string. (let ((epa-file-name-regexp "\\`\\'") (coding-system-for-read 'binary) (coding-system-for-write 'binary)) (when (fboundp 'epa-file-name-regexp-update) (epa-file-name-regexp-update)) (with-temp-file file (set-buffer-multibyte nil) (delete-region (point-min) (point-max)) (insert (epg-encrypt-string context str nil)) (message "Encrypting...wrote %s" file) t)) (when (fboundp 'epa-file-name-regexp-update) (epa-file-name-regexp-update))) (error (message "%s" (cdr err)) nil)))) ((require 'alpaca nil t) ;; Create the file. ;; This is required because `alpaca-save-buffer' checks its timestamp. (with-temp-file file) (with-temp-buffer (let ((buffer-file-name file) (coding-system-for-read 'binary) (coding-system-for-write 'binary) ;; Bind `default-directory' to the temporary directory ;; because it is possible that the directory pointed by ;; `default-directory' has been already removed. (default-directory temporary-file-directory)) (insert str) (condition-case nil (if (alpaca-save-buffer) t (delete-file file) nil) (error (when (file-exists-p file) (delete-file file)) nil))))) (t nil))) (defun twittering-ensure-private-info () "Ensure that private information is loaded if necessary. Return non-nil if `twittering-use-master-password' is nil or private information has been already loaded. Also, return non-nil if `twittering-use-master-password' is non-nil and this function succeeded in loading private information. Return nil if private information cannot be loaded." (if (or (not twittering-use-master-password) (twittering-private-info-loaded-p)) ;; The private information is unnecessary or already loaded. t (cond ((not (twittering-capable-of-encryption-p)) (message "You need GnuPG and (EasyPG or alpaca.el) for master password!") nil) ((and (memq twittering-auth-method '(oauth xauth)) (file-exists-p twittering-private-info-file)) (cond ((twittering-load-private-info-with-guide) (setq twittering-private-info-file-loaded t) (message "The authorized token is loaded.") t) (t (message "Failed to load an authorized token from \"%s\"." twittering-private-info-file) nil))) (t ;; The file for private infomation does not exist now. t)))) ;;;; ;;;; Asynchronous retrieval ;;;; (defvar twittering-url-data-hash (make-hash-table :test 'equal)) (defvar twittering-url-request-list nil) (defvar twittering-url-request-sentinel-hash (make-hash-table :test 'equal)) (defvar twittering-internal-url-queue nil) (defvar twittering-url-request-resolving-p nil) (defvar twittering-url-request-retry-limit 3) (defvar twittering-url-request-sentinel-delay 1.0 "*Delay from completing retrieval to invoking associated sentinels. Sentinels registered by `twittering-url-retrieve-async' will be invoked after retrieval is completed and Emacs remains idle a certain time, which this variable specifies. The unit is second.") (defun twittering-remove-redundant-queries (queue) (remove nil (mapcar (lambda (url) (let ((current (gethash url twittering-url-data-hash))) (when (or (null current) (and (integerp current) (< current twittering-url-request-retry-limit))) url))) (twittering-remove-duplicates queue)))) (defun twittering-resolve-url-request () "Resolve requests of asynchronous URL retrieval." (when (null twittering-url-request-resolving-p) (setq twittering-url-request-resolving-p t) ;; It is assumed that the following part is not processed ;; in parallel. (setq twittering-internal-url-queue (append twittering-internal-url-queue twittering-url-request-list)) (setq twittering-url-request-list nil) (setq twittering-internal-url-queue (twittering-remove-redundant-queries twittering-internal-url-queue)) (if (null twittering-internal-url-queue) (setq twittering-url-request-resolving-p nil) (let* ((url (car twittering-internal-url-queue)) (request (twittering-make-http-request-from-uri "GET" nil url)) (additional-info `((uri . ,url)))) (twittering-send-http-request request additional-info 'twittering-url-retrieve-async-sentinel 'twittering-url-retrieve-async-clean-up-sentinel))))) (defun twittering-url-retrieve-async-sentinel (proc status connection-info header-info) (let ((status-line (cdr (assq 'status-line header-info))) (status-code (cdr (assq 'status-code header-info))) (uri (cdr (assq 'uri (assq 'request connection-info))))) (when (string= status-code "200") (let ((body (string-as-unibyte (buffer-string)))) (puthash uri body twittering-url-data-hash) (setq twittering-internal-url-queue (remove uri twittering-internal-url-queue)) (let ((sentinels (gethash uri twittering-url-request-sentinel-hash))) (when sentinels (remhash uri twittering-url-request-sentinel-hash)) (twittering-run-on-idle twittering-url-request-sentinel-delay (lambda (sentinels uri body) (mapc (lambda (func) (funcall func uri body)) sentinels) ;; Resolve the rest of requests. (setq twittering-url-request-resolving-p nil) (twittering-resolve-url-request)) sentinels uri body) ;; Without the following nil, it seems that the value of ;; `sentinels' is displayed. nil))))) (defun twittering-url-retrieve-async-clean-up-sentinel (proc status connection-info) (when (memq status '(exit signal closed failed)) (let* ((uri (cdr (assq 'uri connection-info))) (current (gethash uri twittering-url-data-hash))) (when (or (null current) (integerp current)) ;; Increment the counter on failure and then retry retrieval. (puthash uri (1+ (or current 0)) twittering-url-data-hash) (setq twittering-url-request-resolving-p nil) (twittering-resolve-url-request))))) (defun twittering-url-retrieve-async (url &optional sentinel) "Retrieve URL asynchronously and call SENTINEL with the retrieved data. The request is placed at the last of queries queue. When the data has been retrieved and Emacs remains idle a certain time specified by `twittering-url-request-sentinel-delay', SENTINEL will be called as (funcall SENTINEL URL url-data). The retrieved data can be referred as (gethash URL twittering-url-data-hash)." (let ((data (gethash url twittering-url-data-hash))) (cond ((or (null data) (integerp data)) (add-to-list 'twittering-url-request-list url t) (when sentinel (let ((current (gethash url twittering-url-request-sentinel-hash))) (unless (member sentinel current) (puthash url (cons sentinel current) twittering-url-request-sentinel-hash)))) (twittering-resolve-url-request) nil) (t ;; URL has been already retrieved. (twittering-run-on-idle twittering-url-request-sentinel-delay sentinel url data) data)))) ;;;; ;;;; XML parser ;;;; (defun twittering-ucs-to-char-internal (code-point) ;; Check (featurep 'unicode) is a workaround with navi2ch to avoid ;; error "error in process sentinel: Cannot open load file: ;; unicode". ;; ;; Details: navi2ch prior to 1.8.3 (which is currently last release ;; version as of 2010-01-18) always define `ucs-to-char' as autoload ;; file "unicode(.el)" (which came from Mule-UCS), hence it breaks ;; `ucs-to-char' under non Mule-UCS environment. The problem is ;; fixed in navi2ch dated 2010-01-16 or later, but not released yet. (if (and (featurep 'unicode) (functionp 'ucs-to-char)) (ucs-to-char code-point) ;; Emacs21 have a partial support for UTF-8 text, so it can decode ;; only parts of a text with Japanese. (decode-char 'ucs code-point))) (defvar twittering-unicode-replacement-char ;; "Unicode Character 'REPLACEMENT CHARACTER' (U+FFFD)" (or (twittering-ucs-to-char-internal #xFFFD) ??) "*Replacement character returned by `twittering-ucs-to-char' when it fails to decode a code.") (defun twittering-ucs-to-char (code-point) "Return a character specified by CODE-POINT in Unicode. If it fails to decode the code, return `twittering-unicode-replacement-char'." (or (twittering-ucs-to-char-internal code-point) twittering-unicode-replacement-char)) (defadvice decode-char (after twittering-add-fail-over-to-decode-char) (when (null ad-return-value) (setq ad-return-value twittering-unicode-replacement-char))) (defun twittering-xml-parse-region (&rest args) "Wrapped `xml-parse-region' in order to avoid decoding errors. After activating the advice `twittering-add-fail-over-to-decode-char', `xml-parse-region' is called. This prevents `xml-parse-region' from exiting abnormally by decoding unknown numeric character reference." (let ((activated (ad-is-active 'decode-char))) (ad-enable-advice 'decode-char 'after 'twittering-add-fail-over-to-decode-char) (ad-activate 'decode-char) (unwind-protect (condition-case err (apply 'xml-parse-region args) (error (message "Failed to parse the retrieved XML.") nil)) (ad-disable-advice 'decode-char 'after 'twittering-add-fail-over-to-decode-char) (if activated (ad-activate 'decode-char) (ad-deactivate 'decode-char))))) ;;;; ;;;; JSON parser with a fallback character ;;;; (defconst twittering-surrogate-pair-regexp (if (<= 23 emacs-major-version) ;; Literal strings such as "\uXXXX" is not allowed in Emacs 21 ;; and earlier. A character of invalid code point such as U+D800 ;; is not allowed in Emacs 22. ;; To avoid errors caused by literal strings invalid in Emacs 22 ;; and earlier, the regexp is generated indirectly. (format "[%c-%c][%c-%c]" (decode-char 'ucs #xd800) (decode-char 'ucs #xdbff) (decode-char 'ucs #xdc00) (decode-char 'ucs #xdfff)) ;; A regexp that never matches any strings. "\\'\\`") "Regexp to match a surrogate pair for CESU-8. In Emacs 22 and earlier, this variable is initialized by a regexp that never matches any string because code points for a surrogate pair, from U+D800 to U+DFFF, are invalid.") (defun twittering-decode-surrogate-pairs-as-cesu-8 (str) "Decode surrogate pairs in STR similarly to CESU-8. If STR includes surrogate pairs represented by code points from U+D800 to U+DFFF, decode them with CESU-8 and return the result. A character not in the Basic Multilingual Plane is represented by a surrogate pair in JSON (RFC4627). This is similar to CESU-8. But the function `json-read' in `json.el' does not correctly decode surrogate pairs. Therefore, `json-read' may return a string including invalid code points from U+D800 to U+DFFF. This function decodes such invalid code points." (let ((str str) (prev 0) (current 0) (result "")) (while (setq current (string-match twittering-surrogate-pair-regexp str prev)) (let* ((next (match-end 0)) (decoded-str (decode-coding-string (mapconcat (lambda (c) (let* ((code-point (encode-char c 'ucs)) (b1 (/ code-point #x100)) (b2 (% code-point #x100))) (unibyte-string b1 b2))) (match-string 0 str) "") 'utf-16))) (setq result (concat result (substring str prev current) decoded-str)) (setq prev next))) (setq result (concat result (substring str prev))) result)) (defadvice json-read-string (after twittering-decode-surrogate-pairs-as-cesu-8) (when (<= 23 emacs-major-version) (setq ad-return-value (twittering-decode-surrogate-pairs-as-cesu-8 ad-return-value)))) (defun twittering-json-read (&rest args) "Wrapped `json-read' in order to avoid decoding errors. `json-read' is called after activating the advice `twittering-add-fail-over-to-decode-char'. This prevents `json-read' from exiting abnormally by decoding an unknown numeric character reference." (let ((activated (ad-is-active 'decode-char)) (json-activated (ad-is-active 'json-read-string))) (ad-enable-advice 'decode-char 'after 'twittering-add-fail-over-to-decode-char) (ad-activate 'decode-char) (ad-enable-advice 'json-read-string 'after 'twittering-decode-surrogate-pairs-as-cesu-8) (ad-activate 'json-read-string) (unwind-protect (condition-case err (apply 'json-read args) (error (message "Failed to parse the retrieved JSON.") nil)) (ad-disable-advice 'decode-char 'after 'twittering-add-fail-over-to-decode-char) (ad-disable-advice 'json-read-string 'after 'twittering-decode-surrogate-pairs-as-cesu-8) (if activated (ad-activate 'decode-char) (ad-deactivate 'decode-char)) (if json-activated (ad-activate 'json-read-string) (ad-deactivate 'json-read-string)) ))) ;;;; ;;;; Window configuration ;;;; (defun twittering-set-window-end (window pos) (let* ((height (window-text-height window)) (n (- (- height 1)))) (while (progn (setq n (1+ n)) (set-window-start window (with-current-buffer (window-buffer window) (save-excursion (goto-char pos) (line-beginning-position n)))) (not (pos-visible-in-window-p pos window)))))) (defun twittering-current-window-config (window-list) "Return window parameters of WINDOW-LIST." (mapcar (lambda (win) (let ((start (window-start win)) (point (window-point win))) `(,win ,start ,point))) window-list)) (defun twittering-restore-window-config-after-modification (config beg end) "Restore window parameters changed by modification on given region. CONFIG is window parameters made by `twittering-current-window-config'. BEG and END mean a region that had been modified." (mapc (lambda (entry) (let ((win (elt entry 0)) (start (elt entry 1)) (point (elt entry 2))) (when (and (< beg start) (< start end)) (set-window-start win start)) (when (and (< beg point) (< point end)) (set-window-point win point)))) config)) (defun twittering-pop-to-buffer (buf) "Select the buffer BUF in some window. The behavior is determined by the function specified by `twittering-pop-to-buffer-function'." (funcall twittering-pop-to-buffer-function buf)) (defun twittering-pop-to-buffer-simple (buf) "Select the buffer BUF by using `pop-to-buffer'." (let ((win (selected-window))) (pop-to-buffer buf) ;; This is required because the new window generated by `pop-to-buffer' ;; may hide the region following the current position. (twittering-ensure-whole-of-status-is-visible win))) (defun twittering-pop-to-buffer-in-current-window (buf &optional win) "Select the buffer BUF in the window WIN by splitting it. If WIN is nil, the selected window is splitted." (let* ((win (or win (selected-window))) (size (let ((rest (- (window-height win) 15))) (if (<= rest 3) ;; To avoid an error due to a too small window. nil rest))) (new-win (split-window win size))) (select-window new-win) (switch-to-buffer buf))) (defun twittering-pop-to-buffer-in-largest-window (buf) "Select the buffer BUF in the largest window by splitting it." (let ((win (lexical-let ((max-area 0) (largest-win nil)) (walk-windows (lambda (win) (let ((area (* (window-height win) (window-width win)))) (when (< max-area area) (setq max-area area) (setq largest-win win))))) largest-win))) (twittering-pop-to-buffer-in-current-window buf win))) (defun twittering-pop-to-buffer-in-bottom-largest-window (buf) "Select the buffer BUF in the window largest on bottom by splitting it." (let* ((bottom-win-list (lexical-let ((win-list '()) (max-bottom 0)) (walk-windows (lambda (win) (let ((bottom (nth 3 (window-edges win)))) (cond ((< max-bottom bottom) (setq max-bottom bottom) (setq win-list `(,win))) ((= max-bottom bottom) (setq win-list (cons win win-list))) (t nil))))) win-list)) (win (lexical-let ((max-area 0) (largest-win nil)) (mapc (lambda (win) (let ((area (* (window-height win) (window-width win)))) (when (< max-area area) (setq largest-win win) (setq max-area area)))) bottom-win-list) largest-win))) (twittering-pop-to-buffer-in-current-window buf win))) ;;;; ;;;; URI shortening ;;;; (defun twittering-tinyurl-get (longurl &optional service) "Shorten LONGURL with the service specified by `twittering-tinyurl-service'." (let* ((service (or service twittering-tinyurl-service)) (api (cdr (assq service twittering-tinyurl-services-map))) (request-generator (when (listp api) (elt api 0))) (post-process (when (listp api) (elt api 1))) (encoded-url (twittering-percent-encode longurl)) (request (cond ((stringp api) (twittering-make-http-request-from-uri "GET" nil (concat api encoded-url))) ((stringp request-generator) (twittering-make-http-request-from-uri "GET" nil (concat request-generator encoded-url))) ((functionp request-generator) (funcall request-generator service longurl)) (t (error "%s is invalid. try one of %s" (symbol-name service) (mapconcat (lambda (x) (symbol-name (car x))) twittering-tinyurl-services-map ", ")) nil))) (additional-info `((longurl . ,longurl)))) (cond ((null request) (error "Failed to generate a HTTP request for shortening %s with %s" longurl (symbol-name service)) nil) (t (lexical-let ((result 'queried)) (let ((proc (twittering-send-http-request request additional-info (lambda (proc status connection-info header-info) (let ((status-line (cdr (assq 'status-line header-info))) (status-code (cdr (assq 'status-code header-info)))) (case-string status-code (("200") (setq result (buffer-string)) nil) (t (setq result nil) (format "Response: %s" status-line))))) (lambda (proc status connection-info) (when (and (not (twittering-process-alive-p proc)) (eq result 'queried)) (setq result nil)))))) (twittering-wait-while nil 0.1 (and (eq result 'queried) (twittering-process-alive-p proc))) (when (and (eq result 'queried) (not (twittering-process-alive-p proc))) ;; If the process has been dead, wait a moment because ;; Emacs may be in the middle of evaluating the sentinel. (twittering-wait-while 10 0.1 (eq result 'queried) nil ;; Reset `result' on timeout. (setq result nil)))) (let ((processed-result (if (and result (functionp post-process)) (funcall post-process service result) result))) (if processed-result processed-result (error "Failed to shorten a URL %s with %s" longurl (symbol-name service)) nil))))))) (defun twittering-tinyurl-replace-at-point () "Replace the url at point with a tiny version." (interactive) (let ((url-bounds (bounds-of-thing-at-point 'url))) (when url-bounds (let ((url (twittering-tinyurl-get (thing-at-point 'url)))) (when url (save-restriction (narrow-to-region (car url-bounds) (cdr url-bounds)) (delete-region (point-min) (point-max)) (insert url))))))) (defun twittering-make-http-request-for-bitly (service longurl) "Make a HTTP request for URL shortening service bit.ly or j.mp. Before calling this, you have to configure `twittering-bitly-login' and `twittering-bitly-api-key'." (let* ((query-string (mapconcat (lambda (entry) (concat (car entry) "=" (cdr entry))) `(("login" . ,twittering-bitly-login) ("apiKey" . ,twittering-bitly-api-key) ("format" . "txt") ("longUrl" . ,(twittering-percent-encode longurl))) "&")) (prefix (cdr (assq service '((bit.ly . "http://api.bit.ly/v3/shorten?") (j.mp . "http://api.j.mp/v3/shorten?"))))) (uri (concat prefix query-string))) (twittering-make-http-request-from-uri "GET" nil uri))) ;;;; ;;;; Timeline spec ;;;; ;;; Timeline spec as S-expression ;;; - (user USER): timeline of the user whose name is USER. USER is a string. ;;; - (list USER LIST): ;;; the list LIST of the user USER. LIST and USER are strings. ;;; ;;; - (direct_messages): received direct messages. ;;; - (direct_messages_sent): sent direct messages. ;;; - (favorites): favorites timeline for the current user. ;;; - (favorites USER): favorites timeline for the specified user. ;;; - (friends): friends timeline. ;;; - (home): home timeline. ;;; - (mentions): mentions timeline. ;;; mentions (status containing @username) for the authenticating user. ;;; - (public): public timeline. ;;; - (replies): replies. ;;; - (retweeted_by_me): retweets posted by the authenticating user. ;;; - (retweeted_by_user USER): retweets posted by the user. ;;; - (retweeted_to_me): retweets posted by the authenticating user's friends. ;;; - (retweeted_to_user USER): retweets posted to the user. ;;; - (retweets_of_me): ;;; tweets of the authenticated user that have been retweeted by others. ;;; - (single ID): the single tweet specified by ID. ;;; ;;; - (search STRING): the result of searching with query STRING. ;;; ;;; - (exclude-if FUNC SPEC): ;;; the same timeline as SPEC, except that it does not include tweets ;;; that FUNC returns non-nil for. ;;; - (exclude-re REGEXP-STRING SPEC): ;;; the same timeline as SPEC, except that it does not include tweets ;;; that matches the regular expression specified by REGEXP-STRING. ;;; ;;; - (merge SPEC1 SPEC2 ...): result of merging timelines SPEC1 SPEC2 ... ;;; ;;; Timeline spec string ;;; ;;; SPEC ::= PRIMARY | COMPOSITE ;;; PRIMARY ::= USER | LIST | DIRECT_MESSSAGES | DIRECT_MESSSAGES_SENT ;;; | FRIENDS | HOME | MENTIONS | PUBLIC | REPLIES ;;; | RETWEETED_BY_ME | RETWEETED_BY_USER ;;; | RETWEETED_TO_ME | RETWEETED_TO_USER | RETWEETS_OF_ME ;;; | SEARCH ;;; COMPOSITE ::= EXCLUDE-IF | EXCLUDE-RE | MERGE ;;; ;;; USER ::= /[a-zA-Z0-9_-]+/ ;;; LIST ::= USER "/" LISTNAME ;;; LISTNAME ::= /[a-zA-Z0-9_-]+/ ;;; DIRECT_MESSSAGES ::= ":direct_messages" ;;; DIRECT_MESSSAGES_SENT ::= ":direct_messages_sent" ;;; FAVORITES ::= ":favorites" | ":favorites/" USER ;;; FRIENDS ::= ":friends" ;;; HOME ::= ":home" | "~" ;;; MENTIONS ::= ":mentions" ;;; PUBLIC ::= ":public" ;;; REPLIES ::= ":replies" | "@" ;;; RETWEETED_BY_ME ::= ":retweeted_by_me" ;;; RETWEETED_BY_USER ::= ":retweeted_by_user/" USER ;;; RETWEETED_TO_ME ::= ":retweeted_to_me" ;;; RETWEETED_TO_USER ::= ":retweeted_to_user/" USER ;;; RETWEETS_OF_ME ::= ":retweets_of_me" ;;; SINGLE ::= ":single/" ID ;;; ID ::= /[0-9]+/ ;;; ;;; SEARCH ::= ":search/" QUERY_STRING "/" ;;; QUERY_STRING ::= any string, where "/" is escaped by a backslash. ;;; ;;; EXCLUDE-IF ::= ":exclude-if/" FUNC "/" SPEC ;;; FUNC ::= LAMBDA EXPRESSION | SYMBOL ;;; EXCLUDE-RE ::= ":exclude-re/" REGEXP "/" SPEC ;;; ;;; MERGE ::= "(" MERGED_SPECS ")" ;;; MERGED_SPECS ::= SPEC | SPEC "+" MERGED_SPECS ;;; (defvar twittering-regexp-hash (let ((full-width-number-sign (twittering-ucs-to-char #xff03))) ;; Unicode Character 'FULLWIDTH NUMBER SIGN' (U+FF03) (concat "\\(?:#\\|" (char-to-string full-width-number-sign) "\\)"))) (defvar twittering-regexp-atmark (let ((full-width-commercial-at (twittering-ucs-to-char #xff20))) ;; Unicode Character 'FULLWIDTH COMMERCIAL AT' (U+FF20) (concat "\\(?:@\\|" (char-to-string full-width-commercial-at) "\\)"))) (defun twittering-timeline-spec-to-string (timeline-spec &optional shorten) "Convert TIMELINE-SPEC into a string. If SHORTEN is non-nil, the abbreviated expression will be used." (let ((type (car timeline-spec)) (value (cdr timeline-spec))) (cond ;; user ((eq type 'user) (car value)) ;; list ((eq type 'list) (concat (car value) "/" (cadr value))) ;; simple ((eq type 'direct_messages) ":direct_messages") ((eq type 'direct_messages_sent) ":direct_messages_sent") ((eq type 'favorites) (if value (concat ":favorites/" (car value)) ":favorites")) ((eq type 'friends) ":friends") ((eq type 'home) (if shorten "~" ":home")) ((eq type 'mentions) (if shorten "@" ":mentions")) ((eq type 'public) ":public") ((eq type 'replies) ":replies") ((eq type 'retweeted_by_me) ":retweeted_by_me") ((eq type 'retweeted_by_user) (concat ":retweeted_by_user/" (car value))) ((eq type 'retweeted_to_me) ":retweeted_to_me") ((eq type 'retweeted_to_user) (concat ":retweeted_to_user/" (car value))) ((eq type 'retweets_of_me) ":retweets_of_me") ((eq type 'single) (concat ":single/" (car value))) ((eq type 'search) (let ((query (car value))) (concat ":search/" (replace-regexp-in-string "\\(\\\\\\|/\\)" "\\\\\\1" query) "/"))) ;; composite ((eq type 'exclude-if) (let ((func (car value)) (spec (cadr value)) (print-level nil)) (concat ":exclude-if/" (prin1-to-string func) "/" (twittering-timeline-spec-to-string spec)))) ((eq type 'exclude-re) (let ((regexp-str (car value)) (spec (cadr value)) (print-level nil)) (concat ":exclude-re/" (replace-regexp-in-string "/" "\\\\\/" regexp-str) "/" (twittering-timeline-spec-to-string spec)))) ((eq type 'merge) (concat "(" (mapconcat 'twittering-timeline-spec-to-string value "+") ")")) (t nil)))) (eval-and-compile (defmacro twittering-make-user-timeline-spec-direct (user) `(list 'user ,user)) (defmacro twittering-make-list-timeline-spec-direct (owner listname) `(list 'list ,owner ,listname)) (defmacro twittering-make-hashtag-timeline-spec-direct (tag) `(list 'search (concat "#" ,tag))) (defmacro twittering-make-hashtag-timeline-spec-string-direct (tag) `(concat "#" ,tag))) (defun twittering-extract-timeline-spec (str &optional unresolved-aliases) "Extract one timeline spec from STR. Return cons of the spec and the rest string." (cond ((null str) (error "STR is nil") nil) ((string-match "^\\([a-zA-Z0-9_-]+\\)/\\([[:word:]_-]+\\)" str) (let ((user (match-string 1 str)) (listname (match-string 2 str)) (rest (substring str (match-end 0)))) `(,(twittering-make-list-timeline-spec-direct user listname) . ,rest))) ((string-match "^\\([a-zA-Z0-9_-]+\\)" str) (let ((user (match-string 1 str)) (rest (substring str (match-end 0)))) `(,(twittering-make-user-timeline-spec-direct user) . ,rest))) ((string-match "^~" str) `((home) . ,(substring str (match-end 0)))) ((string-match (concat "^" twittering-regexp-atmark) str) `((mentions) . ,(substring str (match-end 0)))) ((string-match (concat "^" twittering-regexp-hash "\\([[:alpha:]0-9_-]+\\)") str) (let* ((tag (match-string 1 str)) (rest (substring str (match-end 0)))) `(,(twittering-make-hashtag-timeline-spec-direct tag) . ,rest))) ((string-match "^:\\([a-z_-]+\\)" str) (let ((type (match-string 1 str)) (following (substring str (match-end 0))) (alist '(("direct_messages" . direct_messages) ("direct_messages_sent" . direct_messages_sent) ("friends" . friends) ("home" . home) ("mentions" . mentions) ("public" . public) ("replies" . replies) ("retweeted_by_me" . retweeted_by_me) ("retweeted_to_me" . retweeted_to_me) ("retweets_of_me" . retweets_of_me)))) (cond ((assoc type alist) (let ((first-spec (list (cdr (assoc type alist))))) (cons first-spec following))) ((string= type "favorites") (if (string-match "^:favorites/\\([a-zA-Z0-9_-]+\\)" str) (let ((rest (substring str (match-end 0)))) `((favorites ,(match-string 1 str)) . ,rest)) `((favorites) . ,following))) ((string-match "^:retweeted_by_user/\\([a-zA-Z0-9_-]+\\)" str) (let ((user (match-string 1 str)) (rest (substring str (match-end 0)))) `((retweeted_by_user ,user) . ,rest))) ((string-match "^:retweeted_to_user/\\([a-zA-Z0-9_-]+\\)" str) (let ((user (match-string 1 str)) (rest (substring str (match-end 0)))) `((retweeted_to_user ,user) . ,rest))) ((string-match "^:single/\\([0-9]+\\)" str) (let ((id (match-string 1 str)) (rest (substring str (match-end 0)))) `((single ,id) . ,rest))) ((string= type "search") (if (string-match "^:search/\\(\\(.*?[^\\]\\)??\\(\\\\\\\\\\)*\\)??/" str) (let* ((escaped-query (or (match-string 1 str) "")) (query (replace-regexp-in-string "\\\\\\(\\\\\\|/\\)" "\\1" escaped-query)) (rest (substring str (match-end 0)))) (if (not (string= "" escaped-query)) `((search ,query) . ,rest) (error "\"%s\" has no valid regexp" str) nil)))) ((string= type "exclude-if") (let ((result-pair (cond ((string-match "^:exclude-if/\\([^(/]+\\)/" str) `(,(intern (match-string 1 str)) . ,(match-end 1))) ((string-match "^:exclude-if/" str) (condition-case err (read-from-string str (match-end 0)) (error nil)))))) (if result-pair (let ((func (car result-pair)) (pos (cdr result-pair))) (cond ((not (functionp func)) (error "\"%s\" has an invalid function" str) nil) ((<= (length str) (1+ pos)) (error "\"%s\" has no timeline spec" str) nil) ((not (char-equal ?/ (aref str pos))) (error "\"%s\" has no delimiter" str) nil) (t (let* ((pair (twittering-extract-timeline-spec (substring str (1+ pos)) unresolved-aliases)) (spec (car pair)) (rest (cdr pair))) `((exclude-if ,func ,spec) . ,rest))))) (error "\"%s\" has an invalid function" str) nil))) ((string= type "exclude-re") (cond ((string-match "^:exclude-re/\\(\\(.*?[^\\]\\)??\\(\\\\\\\\\\)*\\)??/" str) (let* ((escaped-regexp (or (match-string 1 str) "")) (regexp (replace-regexp-in-string "\\\\/" "/" escaped-regexp nil t)) (following (substring str (match-end 0)))) (cond ((string= "" escaped-regexp) (error "\"%s\" has no valid regexp" str) nil) (t (let* ((pair (twittering-extract-timeline-spec following unresolved-aliases)) (spec (car pair)) (rest (cdr pair))) `((exclude-re ,regexp ,spec) . ,rest)))))) (t (error "\"%s\" has no valid regexp" str) nil))) (t (error "\"%s\" is invalid as a timeline spec" str) nil)))) ((string-match "^\\$\\([a-zA-Z0-9_-]+\\)\\(?:(\\([^)]*\\))\\)?" str) (let* ((name (match-string 1 str)) (rest (substring str (match-end 0))) (value (cdr-safe (assoc name twittering-timeline-spec-alias))) (arg (match-string 2 str))) (if (member name unresolved-aliases) (error "Alias \"%s\" includes a recursive reference" name) (cond ((stringp value) (twittering-extract-timeline-spec (concat value rest) (cons name unresolved-aliases))) ((functionp value) (twittering-extract-timeline-spec (funcall value arg) (cons name unresolved-aliases))) (t (error "Alias \"%s\" is undefined" name)))))) ((string-match "^(" str) (let ((rest (concat "+" (substring str (match-end 0)))) (result '())) (while (and rest (string-match "^\\+" rest)) (let* ((spec-string (substring rest (match-end 0))) (pair (twittering-extract-timeline-spec spec-string unresolved-aliases)) (spec (car pair)) (next-rest (cdr pair))) (setq result (cons spec result)) (setq rest next-rest))) (if (and rest (string-match "^)" rest)) (let ((spec-list (twittering-remove-duplicates (apply 'append (mapcar (lambda (x) (if (eq 'merge (car x)) (cdr x) (list x))) (reverse result)))))) (if (= 1 (length spec-list)) `(,(car spec-list) . ,(substring rest 1)) `((merge ,@spec-list) . ,(substring rest 1)))) (if rest ;; The string following the opening parenthesis `(' ;; can be interpreted without errors, ;; but there is no corresponding closing parenthesis. (error "\"%s\" lacks a closing parenthesis" str)) ;; Does not display additional error messages if an error ;; occurred on interpreting the string following ;; the opening parenthesis `('. nil))) (t (error "\"%s\" is invalid as a timeline spec" str) nil) )) (defun twittering-string-to-timeline-spec (spec-str &optional noerror) "Convert SPEC-STR into a timeline spec. If SPEC-STR is invalid as a timeline spec string, raise an error or return nil if NOERROR is non-nil." (let ((result-pair (condition-case err (twittering-extract-timeline-spec spec-str) (error (if noerror nil (signal (car err) (cdr err)) nil))))) (if (and result-pair (string= "" (cdr result-pair))) (car result-pair) nil))) (defun twittering-timeline-spec-primary-p (spec) "Return non-nil if SPEC is a primary timeline spec. `primary' means that the spec is not a composite timeline spec such as `merge'." (let ((primary-spec-types '(user list direct_messages direct_messages_sent favorites friends home mentions public replies search retweeted_by_me retweeted_by_user retweeted_to_me retweeted_to_user retweets_of_me single)) (type (car spec))) (memq type primary-spec-types))) (defun twittering-timeline-spec-composite-p (spec) "Return non-nil if SPEC is a composite timeline spec. `composite' means that the spec depends on other timelines." (let ((composite-spec-types '(exclude-if exclude-re merge)) (type (car spec))) (memq type composite-spec-types))) (defun twittering-timeline-spec-depending-on-p (spec base-spec) "Return non-nil if SPEC depends on BASE-SPEC." (cond ((twittering-timeline-spec-primary-p spec) (equal spec base-spec)) ((equal spec base-spec) t) (t (remove nil (mapcar (lambda (direct-base-spec) (twittering-timeline-spec-depending-on-p direct-base-spec base-spec)) (twittering-get-base-timeline-specs spec)))))) (defun twittering-timeline-spec-is-user-p (spec) "Return non-nil if SPEC is a user timeline." (and (consp spec) (eq 'user (car spec)))) (defun twittering-timeline-spec-is-direct-messages-p (spec) "Return non-nil if SPEC is a timeline spec which is related of direct_messages." (and spec (memq (car spec) '(direct_messages direct_messages_sent)))) (defun twittering-timeline-spec-is-search-p (spec) "Return non-nil if SPEC is a search timeline spec." (and (consp spec) (eq 'search (car spec)))) (defun twittering-extract-query-string-from-search-timeline-spec (spec) "Return the query string if SPEC is a search timeline spec. If SPEC is not a search timeline spec, return nil." (and (eq 'search (car spec)) (cadr spec))) (defun twittering-equal-string-as-timeline (spec-str1 spec-str2) "Return non-nil if SPEC-STR1 equals SPEC-STR2 as a timeline spec. If either SPEC-STR1 or SPEC-STR2 is invalid as a timeline spec string, return nil." (if (and (stringp spec-str1) (stringp spec-str2)) (let ((spec1 (twittering-string-to-timeline-spec spec-str1 t)) (spec2 (twittering-string-to-timeline-spec spec-str2 t))) (equal spec1 spec2)) nil)) (defun twittering-get-base-timeline-specs (spec) "Return the timeline specs on which the timeline SPEC depends. If SPEC is primary, returns a list consisting of itself. The result timelines may be a composite timeline." (let ((type (car spec))) (cond ((twittering-timeline-spec-primary-p spec) `(,spec)) ((memq type '(exclude-if exclude-re)) `(,(elt spec 2))) ((eq type 'merge) (cdr spec)) (t nil)))) (defun twittering-get-primary-base-timeline-specs (spec) "Return the primary timeline specs on which the timeline SPEC depends. If SPEC is primary, returns a list consisting of itself. The result timelines are primary." (if (twittering-timeline-spec-primary-p spec) `(,spec) (twittering-remove-duplicates (apply 'append (mapcar 'twittering-get-primary-base-timeline-specs (twittering-get-base-timeline-specs spec)))))) (defun twittering-get-dependent-timeline-specs (base-spec) "Return a list of timeline specs that depend on BASE-SPEC. If BASE-SPEC is a primary timeline spec, the return value consists of BASE-SPEC and composite timeline specs that depend on BASE-SPEC and are bound to a live buffer. If BASE-SPEC is a composite timeline spec, the return value consists of composite timeline specs that depend on BASE-SPEC and are bound to a live buffer." (twittering-remove-duplicates `(;; BASE-SPEC may not be bound to a live buffer. ,@(when (twittering-timeline-spec-primary-p base-spec) `(,base-spec)) ,@(remove nil (mapcar (lambda (spec) (when (twittering-timeline-spec-depending-on-p spec base-spec) spec)) (mapcar 'twittering-get-timeline-spec-for-buffer (twittering-get-buffer-list))))))) (defun twittering-generate-composite-timeline (spec base-spec base-statuses) "Generate statuses for the timeline SPEC from BASE-STATUSES. BASE-STATUSES must originate from the BASE-SPEC timeline. If SPEC is a primary timeline and equals BASE-SPEC, just return BASE-STATUSES. If SPEC is a primary timeline and does not equal BASE-SPEC, return nil." (let ((type (car spec))) (cond ((twittering-timeline-spec-primary-p spec) (if (equal spec base-spec) (let ((pattern-list (twittering-get-filter-list-for-timeline-spec spec))) (if pattern-list (remove nil (mapcar (lambda (status) (if (twittering-match-pattern-list status pattern-list) (progn (debug-printf "Exclude the status: %s" status) nil) status)) base-statuses)) base-statuses)) nil)) ((eq type 'exclude-if) (let* ((direct-base (car (twittering-get-base-timeline-specs spec))) (direct-base-statuses (twittering-generate-composite-timeline direct-base base-spec base-statuses)) (func (elt spec 1))) (remove nil (mapcar (lambda (status) (unless (funcall func status) status)) direct-base-statuses)))) ((eq type 'exclude-re) (let* ((direct-base (car (twittering-get-base-timeline-specs spec))) (direct-base-statuses (twittering-generate-composite-timeline direct-base base-spec base-statuses)) (regexp (elt spec 1))) (remove nil (mapcar (lambda (status) (unless (string-match regexp (cdr (assq 'text status))) status)) direct-base-statuses)))) ((eq type 'merge) (sort (apply 'append (mapcar (lambda (direct-base-spec) ;; `copy-sequence' is required because `sort' ;; modifies the appended list that may include ;; `base-statuses' as a tail. ;; `base-statuses' may refer to the original list ;; which already retrieved tweets are registered ;; with. It must not be modified. (copy-sequence (twittering-generate-composite-timeline direct-base-spec base-spec base-statuses))) (twittering-get-base-timeline-specs spec))) (lambda (status1 status2) (let ((id1 (cdr (assq 'id status1))) (id2 (cdr (assq 'id status2)))) (twittering-status-id< id2 id1))))) (t nil)))) ;;;; ;;;; Filter ;;;; (defun twittering-get-filter-list-for-timeline-spec-string (spec-string) (let ((entry-list twittering-filter-alist)) (remove nil (mapcar (lambda (entry) (let ((spec-regexp (if (listp (car entry)) (concat "\\(?:" (mapconcat 'identity (car entry) "\\|") "\\)") (car entry))) (pattern-list (cdr entry))) (when (string-match spec-regexp spec-string) pattern-list))) entry-list)))) (defun twittering-get-filter-list-for-timeline-spec (spec) (when twittering-filter-alist (let* ((spec-string (twittering-timeline-spec-to-string spec)) (short-spec-string (twittering-timeline-spec-to-string spec t)) (regexp-list (twittering-get-filter-list-for-timeline-spec-string spec-string))) (if (string= spec-string short-spec-string) regexp-list (append regexp-list (twittering-get-filter-list-for-timeline-spec-string short-spec-string)))))) (defun twittering-match-pattern (status pattern) (let* ((rest pattern) (matched t)) (while (and rest matched) (let* ((current (car rest)) (sym (car current)) (regexp (cdr current)) (value (cdr (assq sym status))) (value (if (eq sym 'text) (twittering-make-fontified-tweet-text-with-entity status) value))) (unless (and (stringp value) (string-match regexp value)) (setq matched nil)) (setq rest (cdr rest)))) matched)) (defun twittering-match-pattern-list (status pattern-list) (let* ((rest pattern-list) (matched nil)) (while (and rest (not matched)) (let ((current (car rest))) (when (twittering-match-pattern status current) (setq matched t)) (setq rest (cdr rest)))) matched)) ;;;; ;;;; Retrieved statuses (timeline data) ;;;; (defun twittering-current-timeline-id-table (&optional spec) (let ((spec (or spec (twittering-current-timeline-spec)))) (if spec (elt (gethash spec twittering-timeline-data-table) 0) nil))) (defun twittering-current-timeline-referring-id-table (&optional spec) "Return the hash from a ID to the ID of the first observed status referring the former ID." (let* ((spec (or spec (twittering-current-timeline-spec))) (type (car spec))) (cond ((null spec) nil) ((memq type '(exclude-if exclude-re merge)) ;; Use the first non-nil table instead of merging the all tables ;; because it may take a long time to merge them. (car (remove nil (mapcar (lambda (base-spec) (elt (gethash base-spec twittering-timeline-data-table) 1)) (twittering-get-primary-base-timeline-specs spec))))) ((eq type 'single) ;; Single tweet timelines are registered in a special way. ;; See `twittering-retrieve-single-tweet-sentinel'. (elt (gethash '(:single) twittering-timeline-data-table) 1)) (t (elt (gethash spec twittering-timeline-data-table) 1))))) (defun twittering-current-timeline-data (&optional spec) (let* ((spec (or spec (twittering-current-timeline-spec))) (type (car spec))) (cond ((null spec) nil) ((eq type 'single) (let* ((id (cadr spec)) (status (twittering-find-status id))) (if status `(,status) nil))) ((memq type '(exclude-if exclude-re merge)) (let ((primary-base-specs (twittering-get-primary-base-timeline-specs spec))) (sort (apply 'append (mapcar (lambda (primary-spec) ;; `copy-sequence' is required to prevent `sort' ;; from modifying lists of statuses in the database ;; `twittering-timeline-data-table'. ;; The result of `twittering-generate-composite-timeline' ;; may include a list in the database. If so, the simply ;; appended list include it as a tail. (copy-sequence (twittering-generate-composite-timeline spec primary-spec (twittering-current-timeline-data primary-spec)))) primary-base-specs)) (lambda (status1 status2) (let ((id1 (cdr (assq 'id status1))) (id2 (cdr (assq 'id status2)))) (twittering-status-id< id2 id1)))))) ((eq type :single) ;; The timeline spec '(:single) does not correspond to an ordinary ;; timeline. It means an unordered set of tweets retrieved by the ;; 'retrieve-single-tweet command of `twittering-call-api'. ;; If this function is used with the spec '(:single), a specific tweet ;; will be required with the user's intention. ;; In this case, exclusion by patterns does not required. (elt (gethash spec twittering-timeline-data-table) 2)) (t (let ((statuses (elt (gethash spec twittering-timeline-data-table) 2)) (pattern-list (twittering-get-filter-list-for-timeline-spec spec))) (if pattern-list (remove nil (mapcar (lambda (status) (if (twittering-match-pattern-list status pattern-list) (progn (debug-printf "Exclude the status: %s" status) nil) status)) statuses)) statuses)))))) (defun twittering-remove-timeline-data (&optional spec) (let ((spec (or spec (twittering-current-timeline-spec)))) (remhash spec twittering-timeline-data-table))) (defun twittering-find-status (id) (let ((result nil)) (maphash (lambda (spec pair) (let* ((id-table (car pair)) (entry (gethash id id-table))) ;; Take the most detailed status. (when (and entry (or (null result) (< (length result) (length entry)))) (setq result entry)))) twittering-timeline-data-table) result)) (defun twittering-delete-status-from-data-table (id) (let ((modified-spec nil)) (maphash (lambda (spec data) (let* ((id-table (elt data 0)) (referring-id-table (elt data 1)) (timeline-data (elt data 2)) (status (gethash id id-table))) (when status (remhash id id-table) ;; Here, `referring-id-table' is not modified. ;; Therefore, the retweet observed secondly will not appear even ;; if the retweet observed first for the same tweet is deleted. (setq modified-spec (cons `(,spec ,id-table ,referring-id-table ,(remove status timeline-data)) modified-spec))))) twittering-timeline-data-table) (mapc (lambda (spec) (let ((buffer (twittering-get-buffer-from-spec spec))) (when (buffer-live-p buffer) (with-current-buffer buffer (save-excursion (twittering-for-each-property-region 'id (lambda (beg end value) (when (twittering-status-id= id value) (let ((buffer-read-only nil) (separator-pos (min (point-max) (1+ end)))) (delete-region beg separator-pos) (goto-char beg)))) buffer)))))) (twittering-remove-duplicates (apply 'append (mapcar (lambda (data) (let ((spec (car data))) ;; Update the entry for `spec' in ;; `twittering-timeline-data-table' with the new ;; timeline-data that does not include `status'. (puthash spec (cdr data) twittering-timeline-data-table) (twittering-get-dependent-timeline-specs spec))) modified-spec)))))) (defun twittering-get-replied-statuses (id &optional count) "Return a list of replied statuses starting from the status specified by ID. Statuses are stored in ascending-order with respect to their IDs." (let ((result nil) (status (twittering-find-status id))) (while (and (if (numberp count) (<= 0 (setq count (1- count))) t) (let ((replied-id (or (cdr (assq 'in-reply-to-status-id status)) ""))) (unless (string= "" replied-id) (let ((replied-status (twittering-find-status replied-id))) (when replied-status (setq result (cons replied-status result)) (setq status replied-status) t)))))) result)) (defun twittering-have-replied-statuses-p (id) (let ((status (twittering-find-status id))) (when status (let ((replied-id (cdr (assq 'in-reply-to-status-id status)))) (and replied-id (not (string= "" replied-id))))))) (defun twittering-add-statuses-to-timeline-data (statuses &optional spec) "Add STATUSES as new statuses for SPEC and update derived timelines. The function returns a list of lists including an updated timeline spec string and the number of new statuses for the timeline." (let* ((spec (or spec (twittering-current-timeline-spec))) (id-table (or (twittering-current-timeline-id-table spec) (make-hash-table :test 'equal))) (referring-id-table (or (twittering-current-timeline-referring-id-table spec) (make-hash-table :test 'equal))) (timeline-data (twittering-current-timeline-data spec))) (let* ((new-statuses (remove nil (mapcar (lambda (status) (let ((id (cdr (assq 'id status))) (retweeted-id (cdr (assq 'retweeted-id status)))) (unless (or (not retweeted-id) (gethash retweeted-id referring-id-table)) ;; Store the id of the first observed tweet ;; that refers `retweeted-id'. (puthash retweeted-id id referring-id-table)) (if (gethash id id-table) nil (puthash id status id-table) (puthash id id referring-id-table) `((source-spec . ,spec) ,@status)))) statuses))) (new-statuses ;; Sort tweets by ID. ;; This is necessary because `twittering-render-timeline' assumes ;; that given tweets are ordered. (sort new-statuses (lambda (status1 status2) (let ((id1 (cdr (assq 'id status1))) (id2 (cdr (assq 'id status2)))) (twittering-status-id< id2 id1)))))) (when new-statuses (let ((new-timeline-data (sort (append new-statuses timeline-data) (lambda (status1 status2) (let ((id1 (cdr (assq 'id status1))) (id2 (cdr (assq 'id status2)))) (twittering-status-id< id2 id1)))))) (puthash spec `(,id-table ,referring-id-table ,new-timeline-data) twittering-timeline-data-table)) (let ((twittering-new-tweets-spec spec) (twittering-new-tweets-statuses new-statuses) (twittering-new-tweets-count (length new-statuses))) (run-hooks 'twittering-new-tweets-hook))) ;; Update timelines derived from SPEC and return the number of ;; new tweets for each updated timeline. (remove nil (mapcar (lambda (buffer) (let ((other-spec (twittering-get-timeline-spec-for-buffer buffer)) (other-spec-string (twittering-get-timeline-spec-string-for-buffer buffer))) (when (twittering-timeline-spec-depending-on-p other-spec spec) (let* ((twittering-new-tweets-spec other-spec) (twittering-new-tweets-statuses (twittering-generate-composite-timeline other-spec spec new-statuses)) (twittering-new-tweets-count (length twittering-new-tweets-statuses)) (rendered-tweets (twittering-render-timeline buffer twittering-new-tweets-statuses t))) (when rendered-tweets (when (not (equal spec other-spec)) ;; The hook has been alreadly invoked for `spec'. (run-hooks 'twittering-new-tweets-hook)) `(,other-spec-string ,(length rendered-tweets))))))) (twittering-get-buffer-list)))))) ;;;; ;;;; URIs related to a tweet ;;;; (defun twittering-get-status-url (username &optional id) "Generate a URL of a user or a specific status." (let ((func (cdr (assq 'status-url (assq twittering-service-method twittering-service-method-table))))) (funcall func username id))) (defun twittering-get-status-url-from-alist (status) "Generate a URL of a tweet specified by an alist STATUS." (let ((username (cdr (or (assq 'retweeted-user-screen-name status) (assq 'user-screen-name status)))) (id (cdr (or (assq 'retweeted-id status) (assq 'id status)))) (func (cdr (assq 'status-url (assq twittering-service-method twittering-service-method-table))))) (funcall func username id))) (defun twittering-get-list-url (username listname) "Generate a URL of a specific list." (let ((func (cdr (assq 'status-url (assq twittering-service-method twittering-service-method-table)))) (str (concat username "/" listname))) (funcall func str nil))) (defun twittering-get-status-url-twitter (username &optional id) "Generate status URL for Twitter." (if id (format "http://%s/%s/status/%s" twittering-web-host username id) (format "http://%s/%s" twittering-web-host username))) (defun twittering-get-status-url-statusnet (username &optional id) "Generate status URL for StatusNet." (if id (format "http://%s/%s/notice/%s" twittering-web-host twittering-web-path-prefix id) (format "http://%s/%s/%s" twittering-web-host twittering-web-path-prefix username))) (defun twittering-get-search-url (query-string) "Generate a URL for searching QUERY-STRING." (let ((func (cdr (assq 'search-url (assq twittering-service-method twittering-service-method-table))))) (funcall func query-string))) (defun twittering-get-search-url-twitter (query-string) (format "http://%s/search?q=%s" twittering-web-host (twittering-percent-encode query-string))) (defun twittering-get-search-url-statusnet (query-string) (if (string-match "^#\\(.+\\)" query-string) (format "http://%s/%s/tag/%s" twittering-web-host twittering-web-path-prefix (twittering-percent-encode (match-string 1 query-string))) (format "http://%s/search?q=%s" twittering-web-host (twittering-percent-encode query-string)))) (defun twittering-extract-id-from-url (url-string) "Extract the ID from URL-STRING. Return nil if URL-STRING cannot be interpreted as a URL pointing a tweet." (when (string-match "\\`https?://twitter.com/\\(?:#!/\\)?[^/]+/status\\(?:es\\)?/\\([0-9]+\\)/?\\'" url-string) (match-string 1 url-string))) ;;;; ;;;; Utility of status IDs ;;;; (defun twittering-status-id< (id1 id2) (let ((len1 (length id1)) (len2 (length id2))) (cond ((= len1 len2) (string< id1 id2)) ((< len1 len2) t) (t nil)))) (defun twittering-status-id= (id1 id2) (equal id1 id2)) (defun twittering-snowflake-epoch-time () "Return the epoch time of Snowflake." (require 'calc) (let ((epoch-str ;; This corresponds to 2010-11-04 01:42:54+00:00 in RFC3339. ;; The value comes from the following page. ;; https://github.com/twitter/snowflake/blob/6d4634aa490de26e22425538291fe0a03071a170/src/main/scala/com/twitter/service/snowflake/IdWorker.scala#L22 ;; 22 val twepoch = 1288834974657L "1288834974657")) (let ((str (calc-eval `(,(concat "floor(10#" epoch-str "/10#1000)") calc-word-size 64 calc-number-radix 16))) (milisec-str (calc-eval `(,(concat "10#" epoch-str "%10#1000") calc-word-size 64 calc-number-radix 10)))) (mapcar (lambda (s) (string-to-number s 16)) `(,(substring str 3 7) ,(substring str 7) ,milisec-str))))) (defun twittering-id-to-time (id) "Return the time corresonding to ID generated by Snowflake. If ID is a string consisting of 12 or more digits, return the corresponding time in Emacs internal representation the same as `encode-time'. Otherwise, return nil. This is because ID consisting of 11 or less digits may not be generated by Snowflake." (require 'calc) (cond ((not (stringp id)) nil) ((< (length id) 12) ;; The given ID may not be generated by Snowflake. ;; ;; The first tweet in the example response of ;; https://dev.twitter.com/docs/api/1/get/statuses/home_timeline ;; has "18700887835" as the ID. ;; Assuming that it is generated by Snowflake, it corresponds to ;; "2010-11-04 01:42:58+00:00". ;; However, the created_at is "Fri Jul 16 16:58:46 +0000 2010". ;; It can be confirmed at http://twitter.com/cindyli/status/18700887835 . ;; ;; Therefore we can not suppose that an ID is generated by Snowflake ;; if the ID consists of 11-digits. ;; Assuming that an ID reaches 10^11 before Snowflake is turned on at ;; Nov 04 2010, the average number of tweets per day will exceed ;; 533 million. ;; ( 10^11 - 18,700,887,835 > 80,000,000,000 ;; 80 billion / 5 month (from Jul 16 to Nov 4) > 533 million / day ) ;; ;; It is impossible. ;; So, I assume that an ID is generated by Snowflake if the ID consists of ;; 12 or more digits. ;; The first ID with 12-digits, 100,000,000,000 (10^11), corresponds to ;; 2010-11-04 01:43:17+00:00. nil) (t (let* ((epoch (twittering-snowflake-epoch-time)) (str (calc-eval `(,(format "floor(rsh(10#%s,22)/1000)" id) calc-word-size 64 calc-number-radix 16))) (milisec (string-to-number (calc-eval `(,(format "rsh(10#%s,22)%%1000" id) calc-word-size 64 calc-number-radix 10)) 10))) (when (string-match "^16#\\([[:xdigit:]]+\\)" str) (let* ((hex-str (match-string 1 str)) (hex-str (if (< (length hex-str) 4) (concat "0000" hex-str) hex-str))) (time-add epoch `(,(string-to-number (substring hex-str 0 (- (length hex-str) 4)) 16) ,(string-to-number (substring hex-str (- (length hex-str) 4)) 16) ,(* milisec 1000) )))))))) (defun twittering-time-to-id (time) "Return the ID corresponding to TIME by Snowflake. Bits other than timestamp are zero. The least significant 22 bits are zero. TIME must be an Emacs internal representation as a return value of `current-time'." (require 'calc) (let* ((epoch-time (twittering-snowflake-epoch-time)) (dt (if (time-less-p epoch-time time) (time-subtract time epoch-time) nil)) (sec-high (nth 0 dt)) (sec-low (nth 1 dt)) (microsec (or (nth 2 dt) "0"))) (when dt (calc-eval `(,(format "lsh((16#%04x%04x) * 1000 + floor(%d/1000), 22)" sec-high sec-low microsec) calc-word-size 64 calc-number-radix 10))))) ;;;; ;;;; Process info ;;;; (defun twittering-register-process (proc spec &optional str) (let ((str (or str (twittering-timeline-spec-to-string spec)))) (add-to-list 'twittering-process-info-alist `(,proc ,spec ,str)))) (defun twittering-release-process (proc) (let ((pair (assoc proc twittering-process-info-alist))) (when pair (setq twittering-process-info-alist (delq pair twittering-process-info-alist))))) (defun twittering-get-timeline-spec-from-process (proc) (let ((entry (assoc proc twittering-process-info-alist))) (if entry (elt entry 1) nil))) (defun twittering-get-timeline-spec-string-from-process (proc) (let ((entry (assoc proc twittering-process-info-alist))) (if entry (elt entry 2) nil))) (defun twittering-find-processes-for-timeline-spec (spec) (apply 'append (mapcar (lambda (pair) (let ((proc (car pair)) (spec-info (cadr pair))) (if (equal spec-info spec) `(,proc) nil))) twittering-process-info-alist))) (defun twittering-remove-inactive-processes () (let ((inactive-statuses '(nil closed exit failed signal))) (setq twittering-process-info-alist (apply 'append (mapcar (lambda (pair) (let* ((proc (car pair)) (info (cdr pair)) (status (process-status proc))) (if (memq status inactive-statuses) nil `((,proc ,@info))))) twittering-process-info-alist))))) (defun twittering-process-active-p (&optional spec) (twittering-remove-inactive-processes) (if spec (twittering-find-processes-for-timeline-spec spec) twittering-process-info-alist)) ;;;; ;;;; Server info ;;;; (defun twittering-update-api-table (spec api-string) "Register a pair of a timeline spec and an API for retrieving the timeline. SPEC is a timeline spec. API-STRING is an identifier of an API for retrieving the timeline." (let ((current (assoc spec twittering-timeline-spec-to-api-table))) (if (null current) (add-to-list 'twittering-timeline-spec-to-api-table `(,spec . ,api-string)) (setcdr current api-string)))) (defun twittering-make-rate-limit-alist (header-info) "Make a rate-limit information alist from HEADER-INFO. Key symbols of a returned alist are following; limit, remaining, reset-time. Values bound to limit and remaining is a positive integer and one bound to reset-time is an Emacs time (result of `seconds-to-time')." (let ((symbol-table '(("X-Rate-Limit-Limit" . limit) ("X-Rate-Limit-Remaining" . remaining) ("X-Rate-Limit-Reset" . reset-time) ;; For Twitter API v1.0. ("X-RateLimit-Limit" . limit) ("X-RateLimit-Remaining" . remaining) ("X-RateLimit-Reset" . reset-time)))) (remove nil (mapcar (lambda (entry) (let ((sym (cdr (twittering-assoc-string (car entry) symbol-table t)))) (cond ((memq sym '(limit remaining)) `(,sym . ,(string-to-number (cdr entry)))) ((eq sym 'reset-time) `(,sym . ,(seconds-to-time (string-to-number (cdr entry))))) (t nil)))) header-info)))) (defun twittering-update-rate-limit-info (api-string spec header-info) "Register rate-limit information. API-STRING is an identifier of an API. SPEC is a timeline spec that had been retrieved by the API. HEADER-INFO is an alist generated from the HTTP response header of the API." (let* ((api-string (if (eq twittering-service-method 'twitter) ;; The key for Twitter API v1.0 is nil. nil api-string)) (current (assoc api-string twittering-api-limit-info-alist)) (rate-limit-alist (twittering-make-rate-limit-alist header-info))) (twittering-update-api-table spec api-string) (if (null current) (add-to-list 'twittering-api-limit-info-alist `(,api-string . ,rate-limit-alist)) (setcdr current rate-limit-alist)))) (defun twittering-update-server-info (connection-info header-info) (let* ((new-entry-list (mapcar 'car header-info)) (account-info (cdr (assq 'account-info connection-info))) (account (twittering-get-from-account-info "screen_name" account-info)) (spec (cdr (assq 'timeline-spec connection-info))) (api-string (cdr (assq 'uri-without-query (assq 'request connection-info))))) (twittering-update-rate-limit-info api-string spec header-info) (when (remove t (mapcar (lambda (entry) (equal (assoc entry header-info) (assoc entry twittering-server-info-alist))) new-entry-list)) (setq twittering-server-info-alist (append header-info (remove nil (mapcar (lambda (entry) (if (member (car entry) new-entry-list) nil entry)) twittering-server-info-alist)))) (when twittering-display-remaining (mapc (lambda (buffer) (with-current-buffer buffer (twittering-update-mode-line))) (twittering-get-buffer-list)))) ;; cookie (let* ((new-cookies (twittering-extract-cookie connection-info header-info)) (old-cookies (cdr (assoc account twittering-cookie-alist))) (updated-cookies (append new-cookies (remove nil (mapcar (lambda (cookie) (unless (assoc (car cookie) new-cookies) cookie)) old-cookies))))) (setq twittering-cookie-alist (cons (cons account updated-cookies) (remove nil (mapcar (lambda (entry) (unless (equal account (car entry)) entry)) twittering-cookie-alist))))) header-info)) (defun twittering-extract-cookie (connection-info header-info) (remove nil (mapcar (lambda (entry) (let ((header-item (car entry)) (header-value (cdr entry))) (when (and (string= header-item "Set-Cookie") (string-match "\\([^= ]*\\) *= *\\([^; ]*\\) *;? *" header-value)) ;; For ease of implementation, the followings are assumed. ;; 1. Each response header includes only one cookie. ;; 2. `value' of cookie is a token, not a quoted string. ;; 3. Attributes except `domain', `expires' and `path' are ignored. (let* ((name (downcase (match-string 1 header-value))) (value (match-string 2 header-value)) (attributes (mapcar (lambda (str) (when (string-match "\\` *\\([^ ]*\\) *= *\\(.*\\)\\'" str) (let ((attr (downcase (match-string 1 str))) (value (match-string 2 str))) (cond ((string= attr "domain") `(domain . ,value)) ((string= attr "expires") `(expires . ,(apply 'encode-time (parse-time-string (replace-regexp-in-string "-" " " value))))) ((string= attr "path") `(path . ,value)) (t nil))))) (split-string (substring header-value (match-end 0)) " *; *"))) (additional-attributes `(,@(let* ((domain (cdr (assq 'domain attributes))) (request (cdr (assq 'request connection-info))) (host (cdr (assq 'host request))) (prefix (if domain (regexp-quote domain) (concat "\\`" (regexp-quote host))))) `((domain-regexp . ,(concat prefix "\\'"))))))) `(,name (value . ,value) ,@attributes ,@additional-attributes))))) header-info))) (defun twittering-make-cookie-string (request account-info) (let ((account (twittering-get-from-account-info "screen_name" account-info)) (current-time (current-time)) (host (cdr (assq 'host request)))) (when account (mapconcat 'identity (remove nil (mapcar (lambda (entry) (let* ((expires (cdr (assq 'expires entry))) (not-expired (or (null expires) (time-less-p current-time expires))) (domain-regexp (cdr (assq 'domain-regexp entry)))) (when (and not-expired (string-match domain-regexp host)) (format "%s=%s" (car entry) (cdr (assq 'value entry)))))) (cdr (assoc account twittering-cookie-alist)))) ";")))) (defun twittering-get-ratelimit-alist (&optional spec) (let ((api-string (cdr (assoc spec twittering-timeline-spec-to-api-table)))) (cdr (assoc api-string twittering-api-limit-info-alist)))) (defun twittering-get-ratelimit-remaining (&optional spec) (or (cdr (assq 'remaining (twittering-get-ratelimit-alist spec))) 0)) (defun twittering-get-ratelimit-limit (&optional spec) (or (cdr (assq 'limit (twittering-get-ratelimit-alist spec))) 0)) (defun twittering-get-ratelimit-indicator-string (&optional spec) "Make an indicator string of rate-limit information of SPEC." (cond ((eq twittering-service-method 'twitter) ;; Twitter API v1.0. (format "%d/%d" (twittering-get-ratelimit-remaining) (twittering-get-ratelimit-limit))) (t (mapconcat (lambda (api-string) (let* ((alist (cdr (assoc api-string twittering-api-limit-info-alist))) (remaining (cdr (assq 'remaining alist))) (limit (cdr (assq 'limit alist)))) (format "%s/%s" (if remaining (number-to-string remaining) "?") (if limit (number-to-string limit) "?")))) (twittering-remove-duplicates (mapcar (lambda (spec) (cdr (assoc spec twittering-timeline-spec-to-api-table))) (twittering-get-primary-base-timeline-specs spec))) "+")))) ;;;; ;;;; Abstract layer for Twitter API ;;;; (defun twittering-api-path (&rest params) (mapconcat 'identity `(,twittering-api-prefix ,@params) "")) (defun twittering-call-api (command args-alist &optional additional-info) "Call Twitter API and return the process object for the request. Invoke `twittering-call-api-with-account' with the main account specified by `twittering-get-main-account-info'. For details of arguments, see `twittering-call-api-with-account'." (let ((account-info-alist (twittering-get-main-account-info))) (twittering-call-api-with-account account-info-alist command args-alist additional-info))) (defun twittering-call-api-with-account (account-info-alist command args-alist &optional additional-info) "Call Twitter API and return the process object for the request. COMMAND is a symbol specifying API. ARGS-ALIST is an alist specifying arguments for the API corresponding to COMMAND. Each key of ARGS-ALIST is a symbol. ACCOUNT-INFO-ALIST is an alist storing account information, which has the following key; \"screen_name\", \"oauth_token\" and \"oauth_token_secret\" for OAuth/xAuth, \"screen_name\" and \"password\" for basic authentication. ADDITIONAL-INFO is used as an argument ADDITIONAL-INFO of `twittering-send-http-request'. Sentinels associated to the returned process receives it as the fourth argument. See also the function `twittering-send-http-request'. The valid symbols as COMMAND follows: retrieve-timeline -- Retrieve a timeline. Valid key symbols in ARGS-ALIST: timeline-spec -- the timeline spec to be retrieved. timeline-spec-string -- the string representation of the timeline spec. format -- (optional) the symbol specifying the format. number -- (optional) how many tweets are retrieved. It must be an integer. If nil, `twittering-number-of-tweets-on-retrieval' is used instead. The maximum for search timeline is 100, and that for other timelines is `twittering-max-number-of-tweets-on-retrieval'. If the given number exceeds the maximum, the maximum is used instead. max_id -- (optional) the maximum ID of retrieved tweets. since_id -- (optional) the minimum ID of retrieved tweets. sentinel -- (optional) the sentinel that processes the buffer consisting of retrieved data.. This is used as an argument SENTINEL of `twittering-send-http-request' via `twittering-http-get'. If nil, `twittering-http-get-default-sentinel' is used. clean-up-sentinel -- (optional) the clean-up sentinel that post-processes the buffer associated to the process. This is used as an argument CLEAN-UP-SENTINEL of `twittering-send-http-request' via `twittering-http-get'. page -- (optional and valid only for favorites timeline) which page will be retrieved. retrieve-single-tweet -- Retrieve a single tweet. Valid key symbols in ARGS-ALIST: id -- the ID of the tweet to be retrieved. username -- (optional) the screen name of the author of the tweet. format -- (optional) the symbol specifying the format. sentinel -- (optional) the sentinel that processes the buffer consisting of retrieved data.. This is used as an argument SENTINEL of `twittering-send-http-request' via `twittering-http-get'. If nil, `twittering-http-get-default-sentinel' is used. clean-up-sentinel -- (optional) the clean-up sentinel that post-processes the buffer associated to the process. This is used as an argument CLEAN-UP-SENTINEL of `twittering-send-http-request' via `twittering-http-get'. get-list-index -- Retrieve list names owned by a user. Valid key symbols in ARGS-ALIST: username -- the username. sentinel -- the sentinel that processes retrieved strings. This is used as an argument SENTINEL of `twittering-send-http-request' via `twittering-http-get'. clean-up-sentinel -- (optional) the clean-up sentinel that post-processes the buffer associated to the process. This is used as an argument CLEAN-UP-SENTINEL of `twittering-send-http-request' via `twittering-http-get'. get-list-subscriptions -- Retrieve list names followed by a user. Valid key symbols in ARGS-ALIST: username -- the username. sentinel -- the sentinel that processes retrieved strings. This is used as an argument SENTINEL of `twittering-send-http-request' via `twittering-http-get'. clean-up-sentinel -- (optional) the clean-up sentinel that post-processes the buffer associated to the process. This is used as an argument CLEAN-UP-SENTINEL of `twittering-send-http-request' via `twittering-http-get'. create-friendships -- Follow a user. Valid key symbols in ARGS-ALIST: username -- the username which will be followed. destroy-friendships -- Unfollow a user. Valid key symbols in ARGS-ALIST: username -- the username which will be unfollowed. create-favorites -- Mark a tweet as a favorite. Valid key symbols in ARGS-ALIST: id -- the ID of the target tweet. destroy-favorites -- Remove a mark of a tweet as a favorite. Valid key symbols in ARGS-ALIST: id -- the ID of the target tweet. update-status -- Post a tweet. Valid key symbols in ARGS-ALIST: status -- the string to be posted. in-reply-to-status-id -- (optional) the ID of a status that this post is in reply to. destroy-status -- Destroy a tweet posted by the authenticated user itself. Valid key symbols in ARGS-ALIST: id -- the ID of the target tweet. retweet -- Retweet a tweet. Valid key symbols in ARGS-ALIST: id -- the ID of the target tweet. verify-credentials -- Verify the current credentials. Valid key symbols in ARGS-ALIST: sentinel -- the sentinel that processes returned information. This is used as an argument SENTINEL of `twittering-send-http-request' via `twittering-http-get'. clean-up-sentinel -- the clean-up sentinel that post-processes the buffer associated to the process. This is used as an argument CLEAN-UP-SENTINEL of `twittering-send-http-request' via `twittering-http-get'. send-direct-message -- Send a direct message. Valid key symbols in ARGS-ALIST: username -- the username who the message is sent to. status -- the sent message. mute -- Mute a user. Valid key symbols in ARGS-ALIST: user-id -- the user-id that will be muted. username -- the username who will be muted. This command requires either of the above key. If both are given, `user-id' will be used in REST API. unmute -- Un-mute a user. Valid key symbols in ARGS-ALIST: user-id -- the user-id that will be un-muted. username -- the username who will be un-muted. This command requires either of the above key. If both are given, `user-id' will be used in REST API. block -- Block a user. Valid key symbols in ARGS-ALIST: user-id -- the user-id that will be blocked. username -- the username who will be blocked. This command requires either of the above key. If both are given, `user-id' will be used in REST API. block-and-report-as-spammer -- Block a user and report him or her as a spammer. Valid key symbols in ARGS-ALIST: user-id -- the user-id that will be blocked. username -- the username who will be blocked. This command requires either of the above key. If both are given, `user-id' will be used in REST API. get-service-configuration -- Get the configuration of the server. Valid key symbols in ARGS-ALIST: sentinel -- the sentinel that processes retrieved strings. This is used as an argument SENTINEL of `twittering-send-http-request'. clean-up-sentinel -- (optional) the clean-up sentinel that post-processes the buffer associated to the process. This is used as an argument CLEAN-UP-SENTINEL of `twittering-send-http-request'." (let* ((additional-info `(,@additional-info (service-method . ,twittering-service-method)))) (cond ((memq twittering-service-method '(twitter statusnet)) (twittering-call-api-with-account-in-api1.0 account-info-alist command args-alist additional-info)) ((eq twittering-service-method 'twitter-api-v1.1) (cond ((not (require 'json nil t)) (error "`json.el' is required to use the Twitter REST API v1.1") nil) ((not twittering-use-ssl) (error "SSL is required to use the Twitter REST API v1.1") nil) (t (twittering-call-api-with-account-in-api1.1 account-info-alist command args-alist additional-info)))) (t (error "`twittering-service-method' is an invalid service method") )))) (defun twittering-call-api-with-account-in-api1.0 (account-info-alist command args-alist &optional additional-info) "Call the Twitter REST API v1.0 and return the process object for the request." (cond ((eq command 'retrieve-timeline) ;; Retrieve a timeline. (let* ((spec (cdr (assq 'timeline-spec args-alist))) (spec-string (cdr (assq 'timeline-spec-string args-alist))) (spec-type (car-safe spec)) (max-number (if (eq 'search spec-type) 100 ;; FIXME: refer to defconst. twittering-max-number-of-tweets-on-retrieval)) (number (let ((number (or (cdr (assq 'number args-alist)) (let* ((default-number 20) (n twittering-number-of-tweets-on-retrieval)) (cond ((integerp n) n) ((string-match "^[0-9]+$" n) (string-to-number n 10)) (t default-number)))))) (min (max 1 number) max-number))) (number-str (number-to-string number)) (max_id (cdr (assq 'max_id args-alist))) (page (cdr (assq 'page args-alist))) (since_id (cdr (assq 'since_id args-alist))) (word (when (eq 'search spec-type) (cadr spec))) (parameters (cond ((eq spec-type 'favorites) `(("include_entities" . "true") ,@(when max_id `(("max_id" . ,max_id))) ,@(when page `(("page" . ,page))))) ((eq spec-type 'retweeted_by_user) (let ((username (elt spec 1))) `(("count" . ,number-str) ,@(when max_id `(("max_id" . ,max_id))) ("include_entities" . "true") ("screen_name" . ,username) ,@(when since_id `(("since_id" . ,since_id)))))) ((eq spec-type 'retweeted_to_user) (let ((username (elt spec 1))) `(("count" . ,number-str) ("include_entities" . "true") ,@(when max_id `(("max_id" . ,max_id))) ("screen_name" . ,username) ,@(when since_id `(("since_id" . ,since_id)))))) (t `(,@(when max_id `(("max_id" . ,max_id))) ,@(when since_id `(("since_id" . ,since_id))) ,@(cond ((eq spec-type 'search) `(("include_entities" . "true") ("q" . ,word) ("rpp" . ,number-str) ("with_twitter_user_id". "true"))) ((eq spec-type 'list) (let ((username (elt spec 1)) (list-name (elt spec 2))) `(("include_entities" . "true") ("include_rts" . "true") ("owner_screen_name" . ,username) ("per_page" . ,number-str) ("slug" . ,list-name)))) ((eq spec-type 'user) (let ((username (elt spec 1))) `(("count" . ,number-str) ("include_entities" . "true") ("include_rts" . "true") ("screen_name" . ,username)))) ((memq spec-type '(friends mentions public)) `(("include_entities" . "true") ("count" . ,number-str) ("include_rts" . "true"))) (t ;; direct_messages ;; direct_messages_sent ;; home ;; replies ;; retweeted_by_me ;; retweeted_to_me ;; retweets_of_me `(("include_entities" . "true") ("count" . ,number-str)))))))) (format (let ((format (cdr (assq 'format args-alist)))) (cond ((and format (symbolp format)) format) ((eq spec-type 'search) 'atom) (t 'xml)))) (format-str (symbol-name format)) (simple-spec-list '((direct_messages . "direct_messages") (direct_messages_sent . "direct_messages/sent") (friends . "statuses/friends_timeline") (home . "statuses/home_timeline") (mentions . "statuses/mentions") (public . "statuses/public_timeline") (replies . "statuses/replies") (retweeted_by_me . "statuses/retweeted_by_me") (retweeted_to_me . "statuses/retweeted_to_me") (retweets_of_me . "statuses/retweets_of_me") (user . "statuses/user_timeline"))) (host (cond ((eq spec-type 'search) twittering-api-search-host) (t twittering-api-host))) (method (cond ((eq spec-type 'list) (twittering-api-path "lists/statuses")) ((eq spec-type 'favorites) (let ((user (elt spec 1))) (if user (twittering-api-path "favorites/" user) (twittering-api-path "favorites")))) ((eq spec-type 'retweeted_by_user) (twittering-api-path "statuses/retweeted_by_user")) ((eq spec-type 'retweeted_to_user) (twittering-api-path "statuses/retweeted_to_user")) ((eq spec-type 'search) twittering-search-api-method) ((assq spec-type simple-spec-list) (twittering-api-path (cdr (assq spec-type simple-spec-list)))) (t nil))) (sentinel (cdr (assq 'sentinel args-alist))) (clean-up-sentinel (cdr (assq 'clean-up-sentinel args-alist))) (additional-info `(,@additional-info (format . ,format)))) (cond ((eq spec-type 'single) (let ((id (cadr spec)) (sentinel (or sentinel 'twittering-retrieve-single-tweet-sentinel))) (if (twittering-find-status id) ;; If the status has already retrieved, do nothing. nil (twittering-call-api 'retrieve-single-tweet `((id . ,id) (format . ,format) (sentinel . ,sentinel) (clean-up-sentinel . ,clean-up-sentinel)) additional-info)))) ((and host method) (twittering-http-get account-info-alist host method parameters format-str additional-info sentinel clean-up-sentinel)) (t (error "Invalid timeline spec"))))) ((eq command 'retrieve-single-tweet) (let* ((id (cdr (assq 'id args-alist))) (user-screen-name (cdr (assq 'username args-alist))) (format (let ((format (cdr (assq 'format args-alist)))) (cond ((and format (symbolp format)) format) (t 'xml)))) (format-str (symbol-name format)) (parameters '(("include_entities" . "true"))) (sentinel (cdr (assq 'sentinel args-alist))) (clean-up-sentinel (cdr (assq 'clean-up-sentinel args-alist))) (additional-info `(,@additional-info (id . ,id) (user-screen-name . ,user-screen-name) (format . ,format)))) (twittering-http-get account-info-alist twittering-api-host (twittering-api-path "statuses/show/" id) parameters format-str additional-info sentinel clean-up-sentinel))) ((eq command 'get-list-index) ;; Get list names. (let* ((username (cdr (assq 'username args-alist))) (sentinel (cdr (assq 'sentinel args-alist))) (format (if (require 'json nil t) 'json 'xml)) (format-str (symbol-name format)) (clean-up-sentinel (cdr (assq 'clean-up-sentinel args-alist)))) (twittering-http-get account-info-alist twittering-api-host (twittering-api-path username "/lists") nil format-str additional-info sentinel clean-up-sentinel))) ((eq command 'get-list-subscriptions) (let* ((username (cdr (assq 'username args-alist))) (sentinel (cdr (assq 'sentinel args-alist))) (format (if (require 'json nil t) 'json 'xml)) (format-str (symbol-name format)) (clean-up-sentinel (cdr (assq 'clean-up-sentinel args-alist)))) (twittering-http-get account-info-alist twittering-api-host (twittering-api-path username "/lists/subscriptions") nil format-str additional-info sentinel clean-up-sentinel))) ((eq command 'create-friendships) ;; Create a friendship. (let ((username (cdr (assq 'username args-alist)))) (twittering-http-post account-info-alist twittering-api-host (twittering-api-path "friendships/create") `(("screen_name" . ,username)) nil additional-info))) ((eq command 'destroy-friendships) ;; Destroy a friendship (let ((username (cdr (assq 'username args-alist)))) (twittering-http-post account-info-alist twittering-api-host (twittering-api-path "friendships/destroy") `(("screen_name" . ,username)) nil additional-info))) ((eq command 'create-favorites) ;; Create a favorite. (let ((id (cdr (assq 'id args-alist)))) (twittering-http-post account-info-alist twittering-api-host (twittering-api-path "favorites/create/" id) nil nil additional-info))) ((eq command 'destroy-favorites) ;; Destroy a favorite. (let ((id (cdr (assq 'id args-alist)))) (twittering-http-post account-info-alist twittering-api-host (twittering-api-path "favorites/destroy/" id) nil nil additional-info))) ((eq command 'update-status) ;; Post a tweet. (let* ((status (cdr (assq 'status args-alist))) (id (cdr (assq 'in-reply-to-status-id args-alist))) (parameters `(("status" . ,status) ,@(when (eq twittering-auth-method 'basic) '(("source" . "twmode"))) ,@(when id `(("in_reply_to_status_id" . ,id)))))) (twittering-http-post account-info-alist twittering-api-host (twittering-api-path "statuses/update") parameters nil additional-info))) ((eq command 'destroy-status) ;; Destroy a status. (let* ((id (cdr (assq 'id args-alist))) (format (if (require 'json nil t) 'json 'xml)) (format-str (symbol-name format))) (twittering-http-post account-info-alist twittering-api-host (twittering-api-path "statuses/destroy/" id) nil format-str additional-info 'twittering-http-post-destroy-status-sentinel))) ((eq command 'retweet) ;; Post a retweet. (let ((id (cdr (assq 'id args-alist)))) (twittering-http-post account-info-alist twittering-api-host (twittering-api-path "statuses/retweet/" id) nil nil additional-info))) ((eq command 'verify-credentials) ;; Verify the account. (let ((sentinel (cdr (assq 'sentinel args-alist))) (clean-up-sentinel (cdr (assq 'clean-up-sentinel args-alist)))) (twittering-http-get account-info-alist twittering-api-host (twittering-api-path "account/verify_credentials") nil nil additional-info sentinel clean-up-sentinel))) ((eq command 'send-direct-message) ;; Send a direct message. (let ((parameters `(("screen_name" . ,(cdr (assq 'username args-alist))) ("text" . ,(cdr (assq 'status args-alist)))))) (twittering-http-post account-info-alist twittering-api-host (twittering-api-path "direct_messages/new") parameters nil additional-info))) ((eq command 'block) ;; Block a user. (let* ((user-id (cdr (assq 'user-id args-alist))) (username (cdr (assq 'username args-alist))) (parameters (if user-id `(("user_id" . ,user-id)) `(("screen_name" . ,username))))) (twittering-http-post account-info-alist twittering-api-host (twittering-api-path "blocks/create") parameters nil additional-info))) ((eq command 'block-and-report-as-spammer) ;; Report a user as a spammer and block him or her. (let* ((user-id (cdr (assq 'user-id args-alist))) (username (cdr (assq 'username args-alist))) (parameters (if user-id `(("user_id" . ,user-id)) `(("screen_name" . ,username))))) (twittering-http-post account-info-alist twittering-api-host (twittering-api-path "report_spam") parameters nil additional-info))) ((eq command 'get-service-configuration) (let* ((format (if (require 'json nil t) 'json 'xml)) (format-str (symbol-name format)) (request (twittering-make-http-request-from-uri "GET" nil (concat (if twittering-use-ssl "https" "http") "://" twittering-api-host "/" (twittering-api-path "help/configuration." format-str)))) (additional-info nil) (sentinel (cdr (assq 'sentinel args-alist))) (clean-up-sentinel (cdr (assq 'clean-up-sentinel args-alist)))) (twittering-send-http-request request additional-info sentinel clean-up-sentinel))) (t nil))) (defun twittering-call-api-with-account-in-api1.1 (account-info-alist command args-alist &optional additional-info) "Call the Twitter REST API v1.1 and return the process object for the request." (cond ((eq command 'retrieve-timeline) ;; Retrieve a timeline. (let* ((args-alist (let* ((spec (cdr (assq 'timeline-spec args-alist))) (spec-type (car-safe spec)) (table '((friends . (home)) (replies . (mentions))))) (cond ((memq spec-type '(friends replies)) (let* ((alternative (cdr (assq spec-type table))) (alternative-str (twittering-timeline-spec-to-string alternative))) (message "Timeline spec %s is not supported in the Twitter REST API v1.1" spec) `((timeline-spec . ,alternative) (timeline-spec-string . ,alternative-str) ,@args-alist))) (t args-alist)))) (spec (cdr (assq 'timeline-spec args-alist))) (spec-string (cdr (assq 'timeline-spec-string args-alist))) (spec-type (car-safe spec)) (max-number (if (eq 'search spec-type) 100 ;; FIXME: refer to defconst. twittering-max-number-of-tweets-on-retrieval)) (number (let ((number (or (cdr (assq 'number args-alist)) (let* ((default-number 20) (n twittering-number-of-tweets-on-retrieval)) (cond ((integerp n) n) ((string-match "^[0-9]+$" n) (string-to-number n 10)) (t default-number)))))) (min (max 1 number) max-number))) (number-str (number-to-string number)) (max_id (cdr (assq 'max_id args-alist))) (since_id (cdr (assq 'since_id args-alist))) (word (when (eq 'search spec-type) (cadr spec))) (parameters (cond ((eq spec-type 'user) (let ((username (elt spec 1))) `(,twittering-api-host "1.1/statuses/user_timeline" ("count" . ,number-str) ("include_entities" . "true") ("include_rts" . "true") ,@(when max_id `(("max_id" . ,max_id))) ("screen_name" . ,username) ,@(when since_id `(("since_id" . ,since_id))) ("tweet_mode" . "extended") ))) ((eq spec-type 'list) (let ((username (elt spec 1)) (list-name (elt spec 2))) `(,twittering-api-host "1.1/lists/statuses" ("count" . ,number-str) ("include_entities" . "true") ("include_rts" . "true") ,@(when max_id `(("max_id" . ,max_id))) ("owner_screen_name" . ,username) ,@(when since_id `(("since_id" . ,since_id))) ("slug" . ,list-name) ("tweet_mode" . "extended") ))) ((eq spec-type 'direct_messages) `(,twittering-api-host "1.1/direct_messages" ("count" . ,number-str) ("include_entities" . "true") ,@(when max_id `(("max_id" . ,max_id))) ,@(when since_id `(("since_id" . ,since_id))) ("tweet_mode" . "extended"))) ((eq spec-type 'direct_messages_sent) `(,twittering-api-host "1.1/direct_messages/sent" ("count" . ,number-str) ("include_entities" . "true") ,@(when max_id `(("max_id" . ,max_id))) ,@(when since_id `(("since_id" . ,since_id))) ("tweet_mode" . "extended") )) ((eq spec-type 'favorites) (let ((user (elt spec 1))) `(,twittering-api-host "1.1/favorites/list" ("count" . ,number-str) ("include_entities" . "true") ,@(when max_id `(("max_id" . ,max_id))) ,@(when user `(("screen_name" . ,user))) ,@(when since_id `(("since_id" . ,since_id))) ("tweet_mode" . "extended") ))) ((eq spec-type 'home) `(,twittering-api-host "1.1/statuses/home_timeline" ("count" . ,number-str) ("include_entities" . "true") ,@(when max_id `(("max_id" . ,max_id))) ,@(when since_id `(("since_id" . ,since_id))) ("tweet_mode" . "extended") )) ((eq spec-type 'mentions) `(,twittering-api-host "1.1/statuses/mentions_timeline" ("count" . ,number-str) ("include_entities" . "true") ,@(when max_id `(("max_id" . ,max_id))) ,@(when since_id `(("since_id" . ,since_id))) ("tweet_mode" . "extended") )) ((eq spec-type 'public) (error "Timeline spec %s is not supported in the Twitter REST API v1.1" spec) nil) ((memq spec-type '(retweeted_by_me retweeted_by_user retweeted_to_me retweeted_to_user)) (error "Timeline spec %s is not supported in the Twitter REST API v1.1" spec) nil) ((eq spec-type 'retweets_of_me) `(,twittering-api-host "1.1/statuses/retweets_of_me" ("count" . ,number-str) ("include_entities" . "true") ,@(when max_id `(("max_id" . ,max_id))) ,@(when since_id `(("since_id" . ,since_id))) ("tweet_mode" . "extended") )) ((eq spec-type 'single) (let ((id (elt spec 1))) `(,twittering-api-host "1.1/statuses/show" ("id" . ,id) ("include_entities" . "true") ("tweet_mode" . "extended") ))) ((eq spec-type 'search) (let ((word (elt spec 1))) `(,twittering-api-host "1.1/search/tweets" ("count" . ,number-str) ("include_entities" . "true") ,@(when max_id `(("max_id" . ,max_id))) ("q" . ,word) ("result_type" . "recent") ,@(when since_id `(("since_id" . ,since_id))) ("tweet_mode" . "extended") ))) (t (error "Timeline spec %s is unknown" spec-string) nil))) (format 'json) (format-str (symbol-name format)) (host (elt parameters 0)) (method (elt parameters 1)) (http-parameters (nthcdr 2 parameters)) (sentinel (cdr (assq 'sentinel args-alist))) (clean-up-sentinel (cdr (assq 'clean-up-sentinel args-alist))) (additional-info `(,@additional-info (format . ,format))) ;; special treatment for single timeline. (id (cdr (assoc "id" http-parameters))) (sentinel (or sentinel (when (eq spec-type 'single) 'twittering-retrieve-single-tweet-sentinel)))) (cond ((null parameters) nil) ((not (and (string= format-str "json") (require 'json nil t))) (error "The Twitter REST API v1.1 supports only JSON") nil) ((and (eq spec-type 'single) (twittering-find-status id)) ;; If the status has already retrieved, do nothing. nil) ((and host method) (twittering-http-get account-info-alist host method http-parameters format-str additional-info sentinel clean-up-sentinel)) (t (error "Invalid timeline spec") nil)))) ((eq command 'retrieve-single-tweet) (let* ((id (cdr (assq 'id args-alist))) (user-screen-name (cdr (assq 'username args-alist))) (format (let ((format (cdr (assq 'format args-alist)))) (cond ((and format (symbolp format)) format) (t 'json)))) (format-str (symbol-name format)) (sentinel (cdr (assq 'sentinel args-alist))) (clean-up-sentinel (cdr (assq 'clean-up-sentinel args-alist))) (additional-info `(,@additional-info (id . ,id) (user-screen-name . ,user-screen-name) (format . ,format)))) (twittering-call-api-with-account-in-api1.1 account-info-alist 'retrieve-timeline `((timeline-spec . (single ,id)) (format . ,format) (sentinel . ,sentinel) (clean-up-sentinel . ,clean-up-sentinel)) additional-info))) ((eq command 'get-list-index) ;; Get list names. (let* ((username (cdr (assq 'username args-alist))) (sentinel (cdr (assq 'sentinel args-alist))) (host twittering-api-host) (method "1.1/lists/list") (http-parameters `(("screen_name" . ,username))) (format-str "json") (clean-up-sentinel (cdr (assq 'clean-up-sentinel args-alist)))) (twittering-http-get account-info-alist host method http-parameters format-str additional-info sentinel clean-up-sentinel))) ((eq command 'get-list-subscriptions) (let* ((username (cdr (assq 'username args-alist))) (sentinel (cdr (assq 'sentinel args-alist))) (host twittering-api-host) (method "1.1/lists/subscriptions") (http-parameters `(("count" . "20") ("screen_name" . ,username))) (format-str "json") (clean-up-sentinel (cdr (assq 'clean-up-sentinel args-alist)))) (twittering-http-get account-info-alist host method http-parameters format-str additional-info sentinel clean-up-sentinel))) ((eq command 'create-friendships) ;; Create a friendship. (let* ((username (cdr (assq 'username args-alist))) (host twittering-api-host) (method "1.1/friendships/create") (http-parameters `(("screen_name" . ,username))) (format-str "json")) (twittering-http-post account-info-alist host method http-parameters format-str additional-info))) ((eq command 'destroy-friendships) ;; Destroy a friendship (let* ((username (cdr (assq 'username args-alist))) (host twittering-api-host) (method "1.1/friendships/destroy") (http-parameters `(("screen_name" . ,username))) (format-str "json")) (twittering-http-post account-info-alist host method http-parameters format-str additional-info))) ((eq command 'create-favorites) ;; Create a favorite. (let* ((id (cdr (assq 'id args-alist))) (host twittering-api-host) (method "1.1/favorites/create") (http-parameters `(("id" . ,id))) (format-str "json")) (twittering-http-post account-info-alist host method http-parameters format-str additional-info))) ((eq command 'destroy-favorites) ;; Destroy a favorite. (let* ((id (cdr (assq 'id args-alist))) (host twittering-api-host) (method "1.1/favorites/destroy") (http-parameters `(("id" . ,id))) (format-str "json")) (twittering-http-post account-info-alist host method http-parameters format-str additional-info))) ((eq command 'update-status) ;; Post a tweet. (let* ((status (cdr (assq 'status args-alist))) (id (cdr (assq 'in-reply-to-status-id args-alist))) (host twittering-api-host) (method "1.1/statuses/update") (http-parameters `(("status" . ,status) ,@(when id `(("in_reply_to_status_id" . ,id))))) (format-str "json")) (twittering-http-post account-info-alist host method http-parameters format-str additional-info))) ((eq command 'destroy-status) ;; Destroy a status. (let* ((id (cdr (assq 'id args-alist))) (host twittering-api-host) (method (format "1.1/statuses/destroy/%s" id)) (http-parameters nil) (format-str "json")) (twittering-http-post account-info-alist host method http-parameters format-str additional-info 'twittering-http-post-destroy-status-sentinel))) ((eq command 'retweet) ;; Post a retweet. (let* ((id (cdr (assq 'id args-alist))) (host twittering-api-host) (method (format "1.1/statuses/retweet/%s" id)) (http-parameters nil) (format-str "json")) (twittering-http-post account-info-alist host method http-parameters format-str additional-info))) ((eq command 'verify-credentials) ;; Verify the account. (let* ((host twittering-api-host) (method "1.1/account/verify_credentials") (http-parameters nil) (format-str "json") (sentinel (cdr (assq 'sentinel args-alist))) (clean-up-sentinel (cdr (assq 'clean-up-sentinel args-alist)))) (twittering-http-get account-info-alist host method http-parameters format-str additional-info sentinel clean-up-sentinel))) ((eq command 'send-direct-message) ;; Send a direct message. (let* ((host twittering-api-host) (method "1.1/direct_messages/new") (http-parameters `(("screen_name" . ,(cdr (assq 'username args-alist))) ("text" . ,(cdr (assq 'status args-alist))))) (format-str "json")) (twittering-http-post account-info-alist host method http-parameters format-str additional-info))) ((memq command '(mute unmute)) ;; Mute a user. (let* ((user-id (cdr (assq 'user-id args-alist))) (username (cdr (assq 'username args-alist))) (host twittering-api-host) (method (cdr (assq command '((mute . "1.1/mutes/users/create") (unmute . "1.1/mutes/users/destroy"))))) (http-parameters (if user-id `(("user_id" . ,user-id)) `(("screen_name" . ,username)))) (format-str "json")) (twittering-http-post account-info-alist host method http-parameters format-str additional-info))) ((eq command 'block) ;; Block a user. (let* ((user-id (cdr (assq 'user-id args-alist))) (username (cdr (assq 'username args-alist))) (host twittering-api-host) (method "1.1/blocks/create") (http-parameters (if user-id `(("user_id" . ,user-id)) `(("screen_name" . ,username)))) (format-str "json")) (twittering-http-post account-info-alist host method http-parameters format-str additional-info))) ((eq command 'block-and-report-as-spammer) ;; Report a user as a spammer and block him or her. (let* ((user-id (cdr (assq 'user-id args-alist))) (username (cdr (assq 'username args-alist))) (host twittering-api-host) (method "1.1/users/report_spam") (http-parameters (if user-id `(("user_id" . ,user-id)) `(("screen_name" . ,username)))) (format-str "json")) (twittering-http-post account-info-alist host method http-parameters format-str additional-info))) ((eq command 'get-service-configuration) (let* ((host twittering-api-host) (method "1.1/help/configuration") (http-parameters nil) (format-str "json") (additional-info nil) (sentinel (cdr (assq 'sentinel args-alist))) (clean-up-sentinel (cdr (assq 'clean-up-sentinel args-alist)))) (twittering-http-get account-info-alist host method http-parameters format-str additional-info sentinel clean-up-sentinel))) (t nil))) ;;;; ;;;; Service configuration ;;;; (defconst twittering-service-configuration-default '((dm_text_character_limit . 10000) (short_url_length . 23) (short_url_length_https . 23)) "Default value of `twittering-service-configuration'.") (defvar twittering-service-configuration nil "Current server configuration.") (defvar twittering-service-configuration-queried nil) (defvar twittering-service-configuration-update-interval 86400 "*Interval of updating `twittering-service-configuration'.") (defun twittering-get-service-configuration (entry) (let ((pair (assq entry twittering-service-configuration))) (if (null pair) (cdr (assq entry twittering-service-configuration-default)) (cdr pair)))) (defun twittering-update-service-configuration (&optional ignore-time) "Update `twittering-service-configuration' if necessary." (when (and (memq twittering-service-method '(twitter twitter-api-v1.1)) (null twittering-service-configuration-queried) (or ignore-time (let ((current (twittering-get-service-configuration 'time)) (interval (seconds-to-time twittering-service-configuration-update-interval))) (if (null current) t ;; If time passed more than `interval', ;; update the configuration. (time-less-p interval (time-since current)))))) (setq twittering-service-configuration-queried t) (twittering-call-api 'get-service-configuration '((sentinel . twittering-update-service-configuration-sentinel) (clean-up-sentinel . twittering-update-service-configuration-clean-up-sentinel))))) (defun twittering-update-service-configuration-sentinel (proc status connection-info header-info) (let ((status-line (cdr (assq 'status-line header-info))) (status-code (cdr (assq 'status-code header-info))) (format (twittering-get-content-subtype-symbol-from-header-info header-info))) (case-string status-code (("200") (let* ((conf-alist (cond ((eq format 'xml) (let ((xml (twittering-xml-parse-region (point-min) (point-max)))) (mapcar (lambda (entry) `(,(car entry) . ,(elt entry 2))) (cddr (assq 'configuration xml))))) ((eq format 'json) (twittering-json-read)) (t (error "Format \"%s\" is not supported" format) nil))) (entries '(dm_text_character_limit short_url_length short_url_length_https))) (setq twittering-service-configuration `((time . ,(current-time)) ,@(mapcar (lambda (entry) (let ((value (cdr (assq entry conf-alist)))) (cons entry (cond ((stringp value) (string-to-number value)) (t value))))) entries))) (setq twittering-service-configuration-queried nil) nil)) (("400") ;; Rate limit exceeded. (setq twittering-service-configuration-queried nil) (format "Response: %s" (twittering-get-error-message header-info connection-info))) (t (setq twittering-service-configuration-queried nil) (format "Response: %s" (twittering-get-error-message header-info connection-info)))))) (defun twittering-update-service-configuration-clean-up-sentinel (proc status connection-info) (when (not (twittering-process-alive-p proc)) (setq twittering-service-configuration-queried nil))) (defun twittering-get-maximum-message-length (&optional tweet-type) "Return the maximum message length of TWEET-TYPE. If TWEET-TYPE is a symbol `direct-message', return the value of the service configuration `dm_text_character_limit'. Otherwise, return 140." (let ((max-length (if (eq tweet-type 'direct-message) (twittering-get-service-configuration 'dm_text_character_limit) 140))) max-length)) ;;;; ;;;; Account authorization ;;;; (defun twittering-register-account-info (account-info) (setq twittering-oauth-access-token-alist account-info)) (defun twittering-get-main-account-info () (cond ((eq twittering-auth-method 'basic) `(("screen_name" . ,twittering-username) ("password" . ,twittering-password))) ((memq twittering-auth-method '(oauth xauth)) twittering-oauth-access-token-alist))) (defun twittering-get-from-account-info (param account-info) (cdr (assoc param account-info))) (defun twittering-get-username () (let ((account-info (twittering-get-main-account-info))) (twittering-get-from-account-info "screen_name" account-info))) (defun twittering-get-password () (let ((account-info (twittering-get-main-account-info))) (twittering-get-from-account-info "password" account-info))) (defun twittering-make-basic-authentication-string (account-info) (concat "Basic " (base64-encode-string (concat (cdr (assoc "screen_name" account-info)) ":" (cdr (assoc "password" account-info)))))) (defun twittering-make-oauth-authentication-string (account-info request) (let ((method (cdr (assq 'method request))) (access-token (cdr (assoc "oauth_token" account-info))) (access-token-secret (cdr (assoc "oauth_token_secret" account-info)))) (unless (and (stringp access-token) (stringp access-token-secret)) (error "`account-info' has no valid OAuth token")) (twittering-oauth-auth-str-access method (cdr (assq 'uri-without-query request)) (cdr (assq 'encoded-query-alist request)) twittering-oauth-consumer-key twittering-oauth-consumer-secret access-token access-token-secret))) (defun twittering-account-authorized-p () (eq twittering-account-authorization 'authorized)) (defun twittering-account-authorization-queried-p () (eq twittering-account-authorization 'queried)) (defun twittering-prepare-account-info () "Return a pair of username and password. If `twittering-username' is nil, read it from the minibuffer. If `twittering-password' is nil, read it from the minibuffer." (let* ((username (or twittering-username (read-string "your twitter username: "))) (password (or twittering-password (read-passwd (format "%s's twitter password: " username))))) `(,username . ,password))) (defun twittering-has-oauth-access-token-p () (let* ((required-entries '("oauth_token" "oauth_token_secret" "user_id" "screen_name")) (value-list (mapcar (lambda (key) (cdr (assoc key twittering-oauth-access-token-alist))) required-entries))) (null (remove t (mapcar 'stringp value-list))))) (defun twittering-verify-credentials () "Verify the account. This function is an internal function, which should be called from `twittering-ensure-account-verification'. If the account has been authorized already, return t. Otherwise, this function tries to authorize the account. If the authorization succeeded, return t. If the authorization failed, return nil." (cond ((twittering-account-authorized-p) ;; The account has been authorized already. t) ((not (twittering-account-authorization-queried-p)) ;; This function must be invoked from ;; `twittering-ensure-account-verification', which updates the variable ;; `twittering-account-authorization' into the symbol `queried'. (error "`twittering-verify-credentials' is invoked multiple times.") nil) ((and (memq twittering-auth-method '(oauth xauth)) (or (null twittering-oauth-consumer-key) (null twittering-oauth-consumer-secret))) (message "Consumer for OAuth is not specified.") nil) ((twittering-has-oauth-access-token-p) (let* ((username (cdr (assoc "screen_name" (twittering-get-main-account-info)))) (proc (twittering-call-api-with-account (twittering-get-main-account-info) 'verify-credentials `((sentinel . twittering-http-get-verify-credentials-sentinel) (clean-up-sentinel . twittering-http-get-verify-credentials-clean-up-sentinel))))) (cond ((null proc) (message "Process invocation for authorizing \"%s\" failed." username) ;; Failed to authorize the account. nil) (t ;; wait for verification to finish. (twittering-wait-while nil 0.1 (and (twittering-account-authorization-queried-p) (twittering-process-alive-p proc))) (if (not (twittering-account-authorization-queried-p)) ;; The query is completed. (twittering-account-authorized-p) ;; If the process has been dead, wait a moment because ;; Emacs may be in the middle of evaluating the sentinel. (twittering-wait-while 10 0.1 (twittering-account-authorization-queried-p) ;; Succeeded in authorizing the account. t ;; Display a message. (message "Status of Authorization process is `%s'. Type M-x twit to retry." (process-status proc)) ;; Failed to authorize the account. nil)))))) ((eq twittering-auth-method 'oauth) (let* ((scheme (if twittering-oauth-use-ssl "https" "http")) (request-token-url (concat scheme twittering-oauth-request-token-url-without-scheme)) (access-token-url (concat scheme twittering-oauth-access-token-url-without-scheme)) (token-alist (twittering-oauth-get-access-token request-token-url (lambda (token) (concat scheme twittering-oauth-authorization-url-base-without-scheme token)) access-token-url twittering-oauth-consumer-key twittering-oauth-consumer-secret "twittering-mode"))) (cond ((and (assoc "oauth_token" token-alist) (assoc "oauth_token_secret" token-alist) (assoc "screen_name" token-alist)) (let ((username (cdr (assoc "screen_name" token-alist)))) (twittering-register-account-info token-alist) (message "Authorization for the account \"%s\" succeeded." username) (when (and twittering-use-master-password (twittering-capable-of-encryption-p) (not (file-exists-p twittering-private-info-file))) (twittering-save-private-info-with-guide)) ;; Succeeded in authorizing the account. t)) (t ;; There is no global account info that should be invalidated. ;; Failed to authorize the account. (message "Authorization via OAuth failed. Type M-x twit to retry.") nil)))) ((eq twittering-auth-method 'xauth) (let* ((account-info (twittering-prepare-account-info)) (scheme (if twittering-oauth-use-ssl "https" "http")) (access-token-url (concat scheme twittering-oauth-access-token-url-without-scheme)) (token-alist (twittering-xauth-get-access-token access-token-url twittering-oauth-consumer-key twittering-oauth-consumer-secret (car account-info) (cdr account-info)))) ;; Dispose of password as recommended by Twitter. ;; http://dev.twitter.com/pages/xauth (setcdr account-info nil) (cond ((and token-alist (assoc "oauth_token" token-alist) (assoc "oauth_token_secret" token-alist)) (twittering-register-account-info token-alist) (message "Authorization for the account \"%s\" succeeded." (twittering-get-username)) (when (and twittering-use-master-password (twittering-capable-of-encryption-p) (not (file-exists-p twittering-private-info-file))) (twittering-save-private-info-with-guide)) ;; Succeeded in authorizing the account. t) (t ;; Failed to authorize the account. (message "Authorization via xAuth failed. Type M-x twit to retry.") nil)))) ((eq twittering-auth-method 'basic) (let* ((account-info (let ((pair (twittering-prepare-account-info))) `(("screen_name" . ,(car pair)) ("password" . ,(cdr pair))))) ;; Bind account information locally to ensure that ;; the variables are reset when the verification fails. (twittering-username (car account-info)) (twittering-password (cdr account-info)) (proc (twittering-call-api-with-account account-info 'verify-credentials `((sentinel . twittering-http-get-verify-credentials-sentinel) (clean-up-sentinel . twittering-http-get-verify-credentials-clean-up-sentinel))))) (cond ((null proc) (message "Process invocation for authorizing \"%s\" failed." (twittering-get-from-account-info "screen_name" account-info)) ;; Failed to authorize the account. nil) (t ;; wait for verification to finish. (twittering-wait-while nil 0.1 (and (twittering-account-authorization-queried-p) (twittering-process-alive-p proc))) (if (not (twittering-account-authorization-queried-p)) ;; The query is finished. (twittering-account-authorized-p) ;; If the process has been dead, wait a moment because ;; Emacs may be in the middle of evaluating the sentinel. (twittering-wait-while 10 0.1 (twittering-account-authorization-queried-p) ;; Succeeded in authorizing the account. t ;; Display a message. (message "Status of Authorization process is `%s'. Type M-x twit to retry." (process-status proc)) ;; Failed to authorize the account. nil)))))) (t (message "%s is invalid as an authorization method." twittering-auth-method) nil))) (defun twittering-http-get-verify-credentials-sentinel (proc status connection-info header-info) (let* ((status-line (cdr (assq 'status-line header-info))) (status-code (cdr (assq 'status-code header-info))) (account-info (cdr (assq 'account-info connection-info))) (username (twittering-get-from-account-info "screen_name" account-info)) (password (twittering-get-from-account-info "password" account-info))) (case-string status-code (("200") (twittering-register-account-info account-info) (setq twittering-account-authorization 'authorized) (message "Authorization for the account \"%s\" succeeded." username) nil) (("401") (setq twittering-account-authorization nil) (let ((error-mes (format "Authorization for the account \"%s\" failed. Type M-x twit to retry with correct information." username))) ;; Invalidate the account info. (twittering-register-account-info nil) (message "%s" error-mes) nil)) (t (setq twittering-account-authorization nil) (let ((error-mes (format "Authorization for the account \"%s\" failed due to \"%s\"." username status-line))) (message "%s" error-mes) nil))))) (defun twittering-http-get-verify-credentials-clean-up-sentinel (proc status connection-info) (when (and (memq status '(exit signal closed failed)) (eq twittering-account-authorization 'queried)) (setq twittering-account-authorization nil) (let ((exit-status (cond ((processp proc) (process-exit-status proc)) (t 0))) (command (process-command proc))) (if (= 0 exit-status) (message "Authorization failed. Type M-x twit to retry.") (message "Authorization failed: %s exited abnormally (exit-status=%s)." (car command) exit-status))) (setq twittering-username nil) (setq twittering-password nil))) (defun twittering-ensure-account-verification () "Ensure verification of an account. If an account has been already authorized, return t. If a query of authorization is being processed, return nil. Otherwise, this function tries to authorize an account by calling `twittering-verify-credentials'. If the authorization succeeded, return t. If the authorization failed, return nil." (cond ((twittering-account-authorized-p) ;; The account has been already authorized. t) ((twittering-account-authorization-queried-p) ;; The account has not been authorized yet. nil) (t (setq twittering-account-authorization 'queried) (let ((result nil)) (unwind-protect (setq result (twittering-verify-credentials)) (if result (setq twittering-account-authorization 'authorized) (setq twittering-account-authorization nil))) result)))) ;;;; ;;;; Status retrieval ;;;; (defun twittering-add-timeline-history (spec-string) (when (or (null twittering-timeline-history) (not (string= spec-string (car twittering-timeline-history)))) (twittering-add-to-history 'twittering-timeline-history spec-string)) (let ((spec (twittering-string-to-timeline-spec spec-string))) (when (and (twittering-timeline-spec-is-user-p spec) (or (null twittering-user-history) (not (string= spec-string (car twittering-user-history))))) (twittering-add-to-history 'twittering-user-history (cadr spec))))) (defun twittering-remove-timeline-spec-string-from-history (spec-string) (setq twittering-timeline-history (remove nil (mapcar (lambda (str) (if (twittering-equal-string-as-timeline spec-string str) nil str)) twittering-timeline-history)))) (defun twittering-make-alist-of-forbidden-tweet (id &optional user-screen-name) (let ((created-at (or (twittering-id-to-time id) (apply 'encode-time (parse-time-string "Jan 01 00:00:00 +0000 2012"))))) `((forbidden . t) (id . ,id) (created-at . ,created-at) (user-name . nil) (user-screen-name . ,user-screen-name) (text . "SORRY, YOU ARE NOT AUTHORIZED TO SEE THIS TWEET.") ))) (defun twittering-make-alist-of-non-existent-tweet (id &optional user-screen-name) (let ((created-at (or (twittering-id-to-time id) (apply 'encode-time (parse-time-string "Jan 01 00:00:00 +0000 2012"))))) `((forbidden . t) (id . ,id) (created-at . ,created-at) (user-name . nil) (user-screen-name . ,user-screen-name) (text . ,(format "THE TWEET WITH ID %s DOES NOT EXIST." id)) ))) (defun twittering-atom-xmltree-to-status-datum (atom-xml-entry) (let* ((id-str (car (cddr (assq 'id atom-xml-entry)))) (time-str (car (cddr (assq 'updated atom-xml-entry)))) (author-str (car (cddr (assq 'name (assq 'author atom-xml-entry))))) (formatted-time-str ;; ISO 8601 ;; Twitter -> "2010-05-08T05:59:41Z" ;; StatusNet -> "2010-05-08T08:44:39+00:00" (cond ((string-match "\\(.*\\)T\\(.*\\)\\(Z\\|\\([-+][0-2][0-9]\\):?\\([0-5][0-9]\\)\\)" time-str) ;; time-str is formatted as ;; "Combined date and time in UTC:" in ISO 8601. (let ((timezone (match-string 3 time-str))) (format "%s %s %s" (match-string 1 time-str) (match-string 2 time-str) (if (string= "Z" timezone) "+0000" (concat (match-string 4 time-str) (match-string 5 time-str)))))) (t ;; unknown format? time-str)))) `((created-at . ,(date-to-time formatted-time-str)) (id . ,(progn (string-match ":\\([0-9]+\\)$" id-str) (match-string 1 id-str))) ,@(let ((source (twittering-decode-html-entities (car (cddr (assq 'twitter:source atom-xml-entry)))))) `(,@(if (string-match "\\(.*\\)" source) (let ((uri (match-string-no-properties 1 source)) (caption (match-string-no-properties 2 source))) `((source . ,caption) (source-uri . ,uri))) `((source . ,source) (source-uri . ""))))) (text . ,(twittering-decode-html-entities (car (cddr (assq 'title atom-xml-entry))))) ,@(cond ((and (eq twittering-service-method 'statusnet) (string-match "^\\([^ ]+\\)\\( (\\(.*\\))\\)?$" author-str)) ;; StatusNet `((user-screen-name . ,(match-string 1 author-str)) (user-name . ,(or (match-string 3 author-str) "")))) ((string-match "^\\([^ ]+\\) (\\(.*\\))$" author-str) ;; Twitter (default) `((user-screen-name . ,(match-string 1 author-str)) (user-name . ,(match-string 2 author-str)))) (t '((user-screen-name . "PARSING FAILED!!") (user-name . "")))) (user-profile-image-url . ,(let* ((link-items (mapcar (lambda (item) (when (eq 'link (car-safe item)) (cadr item))) atom-xml-entry)) (image-urls (mapcar (lambda (item) (cond ((and (eq twittering-service-method 'statusnet) (member '(rel . "related") item)) ;; StatusNet (cdr (assq 'href item))) ((member '(rel . "image") item) ;; Twitter (default) (cdr (assq 'href item))) (t nil))) link-items))) (car-safe (remq nil image-urls))))))) (defun twittering-atom-xmltree-to-status (atom-xmltree) (let ((entry-list (apply 'append (mapcar (lambda (x) (if (eq (car-safe x) 'entry) `(,x) nil)) (cdar atom-xmltree))))) (mapcar 'twittering-atom-xmltree-to-status-datum entry-list))) (eval-and-compile (defsubst twittering-make-gap-list (text) "Return a list representing index gaps between TEXT and the decoded and normalized text. Indices of a text in a response from Twitter are calculated with the assumption that \"&\", \"<\" and \">\" are encoded as \"&\", \"<\" and \">\" respectively and a Unicode combining character is considered as a character. On rendering a tweet, twittering-mode decode \"&\", \"<\" and \">\". And twittering-mode also normalize its text into canonically equivalent text without combining characters. Therefore, the indices in entities differ from the indices of the corresponding positions in the decoded text. In addition, the normalization to NFC also makes additional gaps between the indices in entities and the corresponding positions. This function assumes that TEXT is already decoded but not normalized. From TEXT, the function calculates the gaps between the encoded text and the decoded and normalized text. This function returns a list of pairs representing the gaps. For each pair, the car means the position in the original TEXT and the cdr means the gap. The (car pair)-th character in the original TEXT corresponds to the (- (car pair) (cdr pair))-th character in the decoded and normalized text." (let ((result nil) (regexp (if (require 'ucs-normalize nil t) (concat "\\(?:\\([<>&]\\)\\|\\(" ucs-normalize-combining-chars-regexp "\\)\\)") "\\([<>&]\\)")) (pos 0) (gap 0)) (while (string-match regexp text pos) (let* ((str (match-string 1 text)) (shift (if str (if (string= str "&") 4 3) 1))) (setq result (cons `(,(+ gap (match-end 0)) . ,(+ gap shift)) result)) (setq gap (+ shift gap))) (setq pos (match-end 0))) (reverse result))) (defun twittering-get-gap (pos gap-list) "Return the gap at the specific position. GAP-LIST must be generated by `twittering-make-gap-list'." (let ((rest-gaps gap-list) (gap 0)) (while (and rest-gaps (< (caar rest-gaps) pos)) (setq gap (cdar rest-gaps)) (setq rest-gaps (cdr rest-gaps))) gap))) (defun twittering-normalize-raw-status (raw-status &optional ignore-retweet) (let* ((status-data (cddr raw-status)) (raw-retweeted-status (assq 'retweeted_status status-data))) (cond ((and raw-retweeted-status (not ignore-retweet)) (let ((retweeted-status (twittering-normalize-raw-status raw-retweeted-status t)) (retweeting-status (twittering-normalize-raw-status raw-status t)) (items-overwritten-by-retweet '(id))) `(,@(mapcar (lambda (entry) (let ((sym (car entry)) (value (cdr entry))) (if (memq sym items-overwritten-by-retweet) (let ((value-on-retweet (cdr (assq sym retweeting-status)))) ;; Replace the value in `retweeted-status' with ;; that in `retweeting-status'. `(,sym . ,value-on-retweet)) `(,sym . ,value)))) retweeted-status) ,@(mapcar (lambda (entry) (let ((sym (car entry)) (value (cdr entry))) `(,(intern (concat "retweeted-" (symbol-name sym))) . ,value))) retweeted-status) ,@(mapcar (lambda (entry) (let ((sym (car entry)) (value (cdr entry))) `(,(intern (concat "retweeting-" (symbol-name sym))) . ,value))) retweeting-status)))) (t (let ((assq-get (lambda (item seq) (car (cddr (assq item seq)))))) `(,@(mapcar (lambda (entry) (let* ((sym (elt entry 0)) (sym-in-data (elt entry 1)) (encoded (elt entry 2)) (data (funcall assq-get sym-in-data status-data))) `(,sym . ,(if encoded (twittering-decode-html-entities (twittering-decode-entities-after-parsing-xml data)) data)))) '(;; Raw entries. (id id) (in-reply-to-screen-name in_reply_to_screen_name) (in-reply-to-status-id in_reply_to_status_id) (recipient-screen-name recipient_screen_name) ;; Encoded entries. (text text t) )) ;; created_at (created-at . ,(date-to-time (funcall assq-get 'created_at status-data))) ;; Replace "true" and "false" into t and nil. ,@(mapcar (lambda (sym) `(,sym . ,(string= "true" (funcall assq-get sym status-data)))) '(favorited truncated)) ;; Entities. ,(let* ((entity-data (cddr (assq 'entities status-data))) (encoded-text (funcall assq-get 'text status-data)) (text (twittering-decode-html-entities (twittering-decode-entities-after-parsing-xml encoded-text))) (gap-list (twittering-make-gap-list text))) (list 'entity ;; hashtags (cons 'hashtags (remove nil (mapcar (lambda (entry) (when (and (consp entry) (eq 'hashtag (car entry))) (let* ((data (cdr entry)) (start-str (cdr (assq 'start (car data)))) (end-str (cdr (assq 'end (car data)))) (start (if (stringp start-str) (string-to-number start-str) 0)) (end (if (stringp end-str) (string-to-number end-str) 0)) (gap (twittering-get-gap start gap-list))) `((start . ,(- start gap)) (end . ,(- end gap)) (text . ,(elt (assq 'text data) 2)))))) (assq 'hashtags entity-data)))) ;; mentions (cons 'mentions (remove nil (mapcar (lambda (entry) (when (and (consp entry) (eq 'user_mention (car entry))) (let* ((data (cdr entry)) (start-str (cdr (assq 'start (car data)))) (end-str (cdr (assq 'end (car data)))) (start (if (stringp start-str) (string-to-number start-str) 0)) (end (if (stringp end-str) (string-to-number end-str) 0)) (gap (twittering-get-gap start gap-list))) `((start . ,(- start gap)) (end . ,(- end gap)) (id . ,(elt (assq 'id data) 2)) (screen-name . ,(elt (assq 'screen_name data) 2)) (name . ,(elt (assq 'name data) 2)))))) (assq 'user_mentions entity-data)))) ;; urls (cons 'urls (remove nil (mapcar (lambda (entry) (when (and (consp entry) (eq 'url (car entry))) (let* ((data (cdr entry)) (start-str (cdr (assq 'start (car data)))) (end-str (cdr (assq 'end (car data)))) (start (if (stringp start-str) (string-to-number start-str) 0)) (end (if (stringp end-str) (string-to-number end-str) 0)) (gap (twittering-get-gap start gap-list))) `((start . ,(- start gap)) (end . ,(- end gap)) (url . ,(elt (assq 'url data) 2)) (display-url . ,(elt (assq 'display_url data) 2)) (expanded-url . ,(elt (assq 'expanded_url data) 2)))))) (assq 'urls entity-data)))))) ;; Source. ,@(let ((source (twittering-decode-html-entities (funcall assq-get 'source status-data)))) (if (and source (string-match "\\(.*\\)" source)) (let ((uri (match-string-no-properties 1 source)) (caption (match-string-no-properties 2 source))) `((source . ,caption) (source-uri . ,uri))) `((source . ,source) (source-uri . "")))) ;; Items related to the user that posted the tweet. ,@(let ((user-data (cddr (assq 'user status-data)))) (mapcar (lambda (entry) (let* ((sym (elt entry 0)) (sym-in-user-data (elt entry 1)) (encoded (elt entry 2)) (value (funcall assq-get sym-in-user-data user-data))) `(,sym . ,(if encoded (twittering-decode-html-entities value) value)))) '(;; Raw entries. (user-id id) (user-profile-image-url profile_image_url) (user-url url) ;; Encoded entries. (user-name name t) (user-screen-name screen_name t) (user-location location t) (user-description description t)))) ,@(let ((user-data (cddr (assq 'user status-data)))) (mapcar (lambda (entry) `(,(car entry) . ,(string= "true" (funcall assq-get (cdr entry) user-data)))) '((user-protected . protected)))))))))) (defun twittering-xmltree-to-status (xmltree) (setq xmltree (cond ((eq 'direct-messages (caar xmltree)) `(,@(mapcar (lambda (c-node) `(status nil (created_at nil ,(caddr (assq 'created_at c-node))) (id nil ,(caddr (assq 'id c-node))) (text nil ,(caddr (assq 'text c-node))) (source nil ,(format "%s" (car c-node))) ;; fake (truncated nil "false") (in_reply_to_status_id nil) (in_reply_to_user_id nil ,(caddr (assq 'recipient_id c-node))) (favorited nil "false") (recipient_screen_name nil ,(caddr (assq 'recipient_screen_name c-node))) (user nil ,@(cdddr (assq 'sender c-node))) (entities nil ,@(cdddr (assq 'entities c-node))))) (remove nil (mapcar (lambda (node) (and (consp node) (eq 'direct_message (car node)) node)) (cdr-safe (assq 'direct-messages xmltree)))) ))) ((eq 'statuses (caar xmltree)) (cddr (car xmltree))) (t ;; unknown format? nil))) (mapcar #'twittering-normalize-raw-status ;; quirk to treat difference between xml.el in Emacs21 and Emacs22 ;; On Emacs22, there may be blank strings (remove nil (mapcar (lambda (x) (if (consp x) x)) xmltree)))) (defun twittering-decode-entities-after-parsing-xml (encoded-str) "Decode ENCODED-STR retrieved by parsing XML and return the result. On Emacs 22 and later, `xml-parse-region' resolves numeric character references. It is redundant to resolve numeric character references again. However, in a XML response from Twitter, the two characters, \"<\" and \">\", are doubly escaped as \"&lt;\" and \"&gt;\", respectively. Then, they are represented as \"<\" and \">\" in the result of `xml-parse-region'. This function decodes them. On Emacs 21, `xml-parse-region' does not resolve numeric character references. This function decodes them." (cond ((null encoded-str) "") ((> 22 emacs-major-version) (replace-regexp-in-string "&#\\([0-9]+\\);" (lambda (str) (let ((number-entity (progn (string-match "&#\\([0-9]+\\);" str) (match-string 1 str)))) (char-to-string (twittering-ucs-to-char (string-to-number number-entity))))) encoded-str)) (t (replace-regexp-in-string "&\\(?:\\(gt\\)\\|\\(lt\\)\\);" (lambda (str) (if (match-beginning 1) ">" "<")) encoded-str)))) (defun twittering-decode-html-entities (encoded-str) (if encoded-str (let ((cursor 0) (found-at nil) (result '())) (while (setq found-at (string-match "&\\(#\\([0-9]+\\)\\|\\([a-zA-Z]+\\)\\);" encoded-str cursor)) (when (> found-at cursor) (list-push (substring encoded-str cursor found-at) result)) (let ((number-entity (match-string-no-properties 2 encoded-str)) (letter-entity (match-string-no-properties 3 encoded-str))) (cond (number-entity (list-push (char-to-string (twittering-ucs-to-char (string-to-number number-entity))) result)) (letter-entity (cond ((string= "amp" letter-entity) (list-push "&" result)) ((string= "gt" letter-entity) (list-push ">" result)) ((string= "lt" letter-entity) (list-push "<" result)) ((string= "quot" letter-entity) (list-push "\"" result)) (t (list-push "?" result)))) (t (list-push "?" result))) (setq cursor (match-end 0)))) (list-push (substring encoded-str cursor) result) (apply 'concat (nreverse result))) "")) ;; JSON (defun twittering-extract-common-element-from-json (json-object) "Extract common parameters of a tweet from JSON-OBJECT. Return an alist including text, created_at and entities, which are common to JSON objects from ordinary timeline and search timeline." (let* ((encoded-text (cdr (or (assq 'text json-object) (assq 'full_text json-object)))) (text (twittering-decode-html-entities (twittering-decode-entities-after-parsing-xml encoded-text))) (gap-list (twittering-make-gap-list text)) (entities (cdr (assq 'entities json-object))) (urls (cdr (assq 'urls entities))) (hashtags (cdr (assq 'hashtags entities))) (mentions (cdr (assq 'user_mentions entities))) (media (cdr (assq 'media entities))) (func (lambda (entry sym-table) (mapcar (lambda (sym-entry) (let ((sym (car sym-entry)) (target (cdr sym-entry))) `(,sym . ,(cdr (assq target entry))))) sym-table)))) `((text . ,(twittering-normalize-string text)) (created-at . ,(apply 'encode-time (parse-time-string (cdr (assq 'created_at json-object))))) (entity (hashtags . ,(mapcar (lambda (entry) (let* ((indices (cdr (assq 'indices entry))) (start (elt indices 0)) (end (elt indices 1)) (gap (twittering-get-gap start gap-list))) `((start . ,(- start gap)) (end . ,(- end gap)) (text . ,(twittering-normalize-string (cdr (assq 'text entry))))))) hashtags)) (mentions . ,(mapcar (lambda (entry) (let* ((indices (cdr (assq 'indices entry))) (start (elt indices 0)) (end (elt indices 1)) (gap (twittering-get-gap start gap-list))) `((start . ,(- start gap)) (end . ,(- end gap)) (id . ,(cdr (assq 'id_str entry))) (name . ,(twittering-normalize-string (cdr (assq 'name entry)))) (screen-name . ,(cdr (assq 'screen_name entry)))))) mentions)) (urls . ,(mapcar (lambda (entry) (let* ((indices (cdr (assq 'indices entry))) (start (elt indices 0)) (end (elt indices 1)) (gap (twittering-get-gap start gap-list))) `((start . ,(- start gap)) (end . ,(- end gap)) (url . ,(cdr (assq 'url entry))) (display-url . ,(cdr (assq 'display_url entry))) (expanded-url . ,(cdr (assq 'expanded_url entry)))))) urls)) (media . ,(mapcar (lambda (entry) (let* ((indices (cdr (assq 'indices entry))) (start (elt indices 0)) (end (elt indices 1)) (gap (twittering-get-gap start gap-list))) `((start . ,(- start gap)) (end . ,(- end gap)) (url . ,(cdr (assq 'url entry))) (raw-entry . ,entry) ,@(funcall func entry '((media-url . media_url) (display-url . display_url) (expanded-url . expanded_url)))))) media))) (retweet-count . ,(cdr (assq 'retweet_count json-object))) (favorite-count . ,(cdr (assq 'favorite_count json-object))) ))) (defun twittering-json-object-to-a-status (json-object) "Convert JSON-OBJECT representing a tweet into an alist representation. JSON-OBJECT must originate in an ordinary timeline, not a search timeline. To convert a JSON object from a search timeline, use `twittering-json-object-to-a-status-on-search'." (let* ((raw-retweeted-status (cdr (assq 'retweeted_status json-object)))) (cond (raw-retweeted-status (let ((retweeted-status (twittering-json-object-to-a-status-base raw-retweeted-status)) (retweeting-status (twittering-json-object-to-a-status-base json-object)) (items-overwritten-by-retweet '(id))) `(,@(mapcar (lambda (entry) (let ((sym (car entry)) (value (cdr entry))) (if (memq sym items-overwritten-by-retweet) (let ((value-on-retweet (cdr (assq sym retweeting-status)))) ;; Replace the value in `retweeted-status' with ;; that in `retweeting-status'. `(,sym . ,value-on-retweet)) `(,sym . ,value)))) retweeted-status) ,@(mapcar (lambda (entry) (let ((sym (car entry)) (value (cdr entry))) `(,(intern (concat "retweeted-" (symbol-name sym))) . ,value))) retweeted-status) ,@(mapcar (lambda (entry) (let ((sym (car entry)) (value (cdr entry))) `(,(intern (concat "retweeting-" (symbol-name sym))) . ,value))) retweeting-status)))) (t (twittering-json-object-to-a-status-base json-object))))) (defun twittering-json-object-to-a-status-base (json-object) (let* ((user-data (cdr (assq 'user json-object))) (raw-quoted-status (cdr (assq 'quoted_status json-object))) (quoted-status (when raw-quoted-status (twittering-json-object-to-a-status raw-quoted-status)))) `(,@(twittering-extract-common-element-from-json json-object) ,@(let ((symbol-table '((favorited . favorited) (id_str . id) (in_reply_to_screen_name . in-reply-to-screen-name) (in_reply_to_status_id_str . in-reply-to-status-id) (recipient_screen_name . recipient-screen-name) (truncated . truncated)))) (remove nil (mapcar (lambda (entry) (let* ((sym (car entry)) (value (cdr entry)) (value (if (and (memq sym '(favorited truncated)) (eq value :json-false)) nil value)) (dest (cdr (assq sym symbol-table)))) (when (and dest value) `(,dest . ,value)))) json-object))) ;; source ,@(let ((source (cdr (assq 'source json-object)))) (if (and source (string-match "\\(.*\\)" source)) (let ((uri (match-string-no-properties 1 source)) (caption (match-string-no-properties 2 source))) `((source . ,(twittering-normalize-string caption)) (source-uri . ,uri))) `((source . ,(twittering-normalize-string source)) (source-uri . "")))) ;; user data ,@(let ((symbol-table '((id_str . user-id) (profile_image_url . user-profile-image-url) (url . user-url) (protected . user-protected) (name . user-name) (screen_name . user-screen-name) (location . user-location) (description . user-description)))) (remove nil (mapcar (lambda (entry) (let* ((sym (car entry)) (value (cdr entry)) (value (cond ((and (eq sym 'protected) (eq value :json-false)) nil) ((memq sym '(name location description)) (twittering-normalize-string value)) (t value)))) (when value (let ((dest (cdr (assq sym symbol-table)))) (when dest `(,dest . ,value)))))) user-data))) ;; Quoted status. ,(when quoted-status `(quoted-status . ,quoted-status)) ))) (defun twittering-json-object-to-a-status-on-search (json-object) "Convert JSON-OBJECT representing a tweet into an alist representation. JSON-OBJECT must originate in a search timeline. To convert a JSON object from other timelines, use `twittering-json-object-to-a-status'." `(,@(twittering-extract-common-element-from-json json-object) ,@(let ((symbol-table '((id_str . id) (to_user . in-reply-to-screen-name) (in_reply_to_status_id_str . in-reply-to-status-id) ;; user data (from_user_id_str . user-id) (profile_image_url . user-profile-image-url) (from_user_name . user-name) (from_user . user-screen-name)))) (remove nil (mapcar (lambda (entry) (let* ((sym (car entry)) (value (cdr entry)) (dest (cdr (assq sym symbol-table)))) (when (and dest value) `(,dest . ,value)))) json-object))) ;; source ,@(let ((source (twittering-decode-html-entities (cdr (assq 'source json-object))))) (if (and source (string-match "\\(.*\\)" source)) (let ((uri (match-string-no-properties 1 source)) (caption (match-string-no-properties 2 source))) `((source . ,caption) (source-uri . ,uri))) `((source . ,source) (source-uri . "")))))) (defun twittering-json-object-to-a-status-on-direct-messages (json-object) "Convert JSON-OBJECT representing a tweet into an alist representation. JSON-OBJECT must originate in timelines related to direct messages. To convert a JSON object from other timelines, use `twittering-json-object-to-a-status'." `(,@(twittering-extract-common-element-from-json json-object) ,@(let ((symbol-table '((id_str . id) (recipient_screen_name . recipient-screen-name)))) (remove nil (mapcar (lambda (entry) (let* ((sym (car entry)) (value (cdr entry)) (dest (cdr (assq sym symbol-table)))) (when (and dest value) `(,dest . ,value)))) json-object))) ;; sender ,@(let ((symbol-table '((id_str . user-id) (name . user-name) (profile_image_url . user-profile-image-url) (protected . user-protected) (screen_name . user-screen-name)))) (remove nil (mapcar (lambda (entry) (let* ((sym (car entry)) (value (cdr entry)) (value (cond ((eq sym 'protected) (if (eq value :json-false) nil t)) ((eq value :json-false) nil) (t value)))) (when value (let ((dest (cdr (assq sym symbol-table)))) (when dest `(,dest . ,value)))))) (cdr (assq 'sender json-object))))))) ;;;; ;;;; List info retrieval ;;;; (defun twittering-get-list-index (username) (twittering-call-api 'get-list-index `((username . ,username) (sentinel . twittering-http-get-list-index-sentinel)))) (defun twittering-get-list-subscriptions (username) (twittering-call-api 'get-list-subscriptions `((username . ,username) (sentinel . twittering-http-get-list-subscriptions-sentinel)))) (defun twittering-get-list-sync (username function) (setq twittering-list-index-retrieved nil) (let ((proc (funcall function username))) (when proc (twittering-wait-while nil 0.1 (and (not twittering-list-index-retrieved) (twittering-process-alive-p proc))) (when (and (not twittering-list-index-retrieved) (not (twittering-process-alive-p proc))) ;; If the process has been dead, wait a moment because ;; Emacs may be in the middle of evaluating the sentinel. (twittering-wait-while 10 0.1 (not twittering-list-index-retrieved))))) (cond ((null twittering-list-index-retrieved) (message "Failed to retrieve %s's lists." username) nil) ((stringp twittering-list-index-retrieved) (if (string= "" twittering-list-index-retrieved) (message "%s does not have a list." username) (message "%s" twittering-list-index-retrieved)) nil) ((listp twittering-list-index-retrieved) twittering-list-index-retrieved))) (defun twittering-get-list-index-sync (username) (twittering-get-list-sync username 'twittering-get-list-index)) (defun twittering-get-list-subscriptions-sync (username) (twittering-get-list-sync username 'twittering-get-list-subscriptions)) ;;;; ;;;; Buffer info ;;;; (defvar twittering-buffer-info-list nil "List of buffers managed by `twittering-mode'.") (defun twittering-get-buffer-list () "Return buffers managed by `twittering-mode'." (twittering-unregister-killed-buffer) twittering-buffer-info-list) (defun twittering-get-active-buffer-list () "Return active buffers managed by `twittering-mode', where statuses are retrieved periodically." (twittering-unregister-killed-buffer) (remove nil (mapcar (lambda (buffer) (if (twittering-buffer-active-p buffer) buffer nil)) twittering-buffer-info-list))) (defun twittering-buffer-p (&optional buffer) "Return t if BUFFER is managed by `twittering-mode'. BUFFER defaults to the the current buffer." (let ((buffer (or buffer (current-buffer)))) (and (buffer-live-p buffer) (memq buffer twittering-buffer-info-list)))) (defun twittering-buffer-related-p () "Return t if current buffer relates to `twittering-mode'." (or (twittering-buffer-p) (eq major-mode 'twittering-edit-mode) (string= (buffer-name (current-buffer)) twittering-debug-buffer))) (defun twittering-buffer-active-p (&optional buffer) "Return t if BUFFER is an active buffer managed by `twittering-mode'. BUFFER defaults to the the current buffer." (let ((buffer (or buffer (current-buffer)))) (and (twittering-buffer-p buffer) (with-current-buffer buffer twittering-active-mode)))) (defun twittering-get-buffer-from-spec (spec) "Return the buffer bound to SPEC. If no buffers are bound to SPEC, return nil." (let* ((spec-string (twittering-timeline-spec-to-string spec)) (buffers (remove nil (mapcar (lambda (buffer) (if (twittering-equal-string-as-timeline spec-string (twittering-get-timeline-spec-string-for-buffer buffer)) buffer nil)) (twittering-get-buffer-list))))) (if buffers ;; We assume that the buffer with the same spec is unique. (car buffers) nil))) (defun twittering-get-buffer-from-spec-string (spec-string) "Return the buffer bound to SPEC-STRING. If no buffers are bound to it, return nil." (let ((spec (twittering-string-to-timeline-spec spec-string))) (and spec (twittering-get-buffer-from-spec spec)))) (defun twittering-get-timeline-spec-for-buffer (buffer) "Return the timeline spec bound to BUFFER. If BUFFER is not managed by `twittering-mode', return nil." (when (twittering-buffer-p buffer) (with-current-buffer buffer twittering-timeline-spec))) (defun twittering-get-timeline-spec-string-for-buffer (buffer) "Return the timeline spec string bound to BUFFER. If BUFFER is not managed by `twittering-mode', return nil." (when (twittering-buffer-p buffer) (with-current-buffer buffer twittering-timeline-spec-string))) (defun twittering-current-timeline-spec () "Return the timeline spec bound to the current buffer. If it is not managed by `twittering-mode', return nil." (twittering-get-timeline-spec-for-buffer (current-buffer))) (defun twittering-current-timeline-spec-string () "Return the timeline spec string bound to the current buffer. If it is not managed by `twittering-mode', return nil." (twittering-get-timeline-spec-string-for-buffer (current-buffer))) (defun twittering-unregister-buffer (buffer &optional keep-timer) "Unregister BUFFER from `twittering-buffer-info-list'. If BUFFER is the last managed buffer and KEEP-TIMER is nil, call `twittering-stop' to stop timers." (when (memq buffer twittering-buffer-info-list) (setq twittering-buffer-info-list (delq buffer twittering-buffer-info-list)) (when (and (null twittering-buffer-info-list) (not keep-timer)) (twittering-stop)))) (defun twittering-unregister-killed-buffer () "Unregister buffers which has been killed." (mapc (lambda (buffer) (unless (buffer-live-p buffer) (twittering-unregister-buffer buffer))) twittering-buffer-info-list)) (defun twittering-replace-spec-string-for-buffer (buffer spec-string) "Replace the timeline spec string for BUFFER with SPEC-STRING when BUFFER is managed by `twittering-mode' and SPEC-STRING is equivalent to the current one." (when (twittering-buffer-p buffer) (let ((current (twittering-get-timeline-spec-string-for-buffer buffer))) (when (and (not (string= current spec-string)) (twittering-equal-string-as-timeline current spec-string)) (with-current-buffer buffer (rename-buffer spec-string t) (setq twittering-timeline-spec-string spec-string)))))) (defun twittering-set-active-flag-for-buffer (buffer active) "Set ACTIVE to active-flag for BUFFER." (when (twittering-buffer-p buffer) (let ((current (twittering-buffer-active-p buffer))) (when (or (and active (not current)) (and (not active) current)) (twittering-toggle-activate-buffer buffer))))) (defun twittering-toggle-activate-buffer (&optional buffer) "Toggle whether to retrieve timeline for the current buffer periodically." (interactive) (let ((buffer (or buffer (current-buffer)))) (when (twittering-buffer-p buffer) (with-current-buffer buffer (let* ((new-mode (not twittering-active-mode)) (active-buffer-list (twittering-get-active-buffer-list)) (start-timer (and new-mode (null active-buffer-list)))) (setq twittering-active-mode new-mode) (when start-timer (twittering-start)) (twittering-update-mode-line)))))) (defun twittering-activate-buffer (&optional buffer) "Activate BUFFER to retrieve timeline for it periodically." (interactive) (let ((buffer (or buffer (current-buffer)))) (twittering-set-active-flag-for-buffer buffer t))) (defun twittering-deactivate-buffer (&optional buffer) "Deactivate BUFFER not to retrieve timeline for it periodically." (interactive) (let ((buffer (or buffer (current-buffer)))) (twittering-set-active-flag-for-buffer buffer nil))) (defun twittering-kill-buffer (&optional buffer) "Kill BUFFER managed by `twittering-mode'." (interactive) (let ((buffer (or buffer (current-buffer)))) (when (twittering-buffer-p buffer) (twittering-deactivate-buffer buffer) (kill-buffer buffer) (twittering-unregister-killed-buffer)))) (defun twittering-get-managed-buffer (spec) "Return the buffer bound to SPEC. If no buffers are bound to SPEC, return newly generated buffer. SPEC may be a timeline spec or a timeline spec string." (let* ((original-spec spec) (spec-string (if (stringp spec) spec (twittering-timeline-spec-to-string spec))) ;; `spec-string' without text properties is required because ;; Emacs21 displays `spec-string' with its properties on mode-line. ;; In addition, copying `spec-string' keeps timeline-data from ;; being modified by `minibuf-isearch.el'. (spec-string (copy-sequence spec-string)) (spec (if (stringp spec-string) (twittering-string-to-timeline-spec spec-string) nil))) (when (null spec) (error "\"%s\" is invalid as a timeline spec" (or spec-string original-spec))) (set-text-properties 0 (length spec-string) nil spec-string) (twittering-add-timeline-history spec-string) (let ((buffer (twittering-get-buffer-from-spec spec))) (if buffer (progn (twittering-replace-spec-string-for-buffer buffer spec-string) (twittering-update-mode-line) buffer) (let ((buffer (generate-new-buffer spec-string)) (start-timer (null twittering-buffer-info-list))) (add-to-list 'twittering-buffer-info-list buffer t) (with-current-buffer buffer (twittering-mode-setup spec-string) (twittering-rerender-timeline-all buffer) (when (twittering-account-authorized-p) (when start-timer ;; If `buffer' is the first managed buffer, ;; call `twittering-start' to start timers. (twittering-start)) (unless (and start-timer twittering-active-mode) ;; If `buffer' is active and the first managed buffer, ;; `twittering-start' invokes ;; `twittering-get-and-render-timeline' indirectly. ;; Otherwise, `twittering-get-and-render-timeline' should be ;; invoked here. (twittering-get-and-render-timeline)))) buffer))))) ;;;; ;;;; Icon mode ;;;; (defvar twittering-icon-mode nil "You MUST NOT CHANGE this variable directly. You should change through function `twittering-icon-mode'.") (defun twittering-icon-mode (&optional arg) "Toggle display of icon images on timelines. With a numeric argument, if the argument is positive, turn on icon mode; otherwise, turn off icon mode." (interactive "P") (let ((prev-mode twittering-icon-mode)) (setq twittering-icon-mode (if (null arg) (not twittering-icon-mode) (< 0 (prefix-numeric-value arg)))) (unless (eq prev-mode twittering-icon-mode) (twittering-update-mode-line) (twittering-rerender-timeline-all (current-buffer) t)))) (defvar twittering-icon-prop-hash (make-hash-table :test 'equal) "Hash table for storing display properties of icon. The key is the size of icon and the value is a hash. The key of the child hash is URL and its value is the display property for the icon.") (defcustom twittering-convert-program (executable-find "convert") "*A path of the command which is invoked for image conversion. The default is determined by searching \"convert\" in `exec-path'. The command must be compatible with \"convert\" of ImageMagick." :group 'twittering-mode :type 'file) (defcustom twittering-convert-fix-size 48 "*Size of an icon image. If nil, an icon image is displayed as is." :group 'twittering-mode :type '(choice (const nil) integer)) (defcustom twittering-use-convert (not (null twittering-convert-program)) "*If non-nil, use \"convert\" for converting or resizing icon images." :group 'twittering-mode :type 'boolean) (defcustom twittering-fallback-image-format 'xpm "*Fallback format used for displaying an image without a supproted format. Images which Emacs does not supports are converted into the fallback image format." :group 'twittering-mode :type 'symbol) (defcustom twittering-use-profile-image-api nil "*Whether to use `profile_image' API for retrieving scaled icon images. NOTE: This API is rate limited and is obsolete in the Twitter REST API v1.1." :group 'twittering-mode :type 'boolean) (defcustom twittering-icon-storage-file (expand-file-name "~/.twittering-mode-icons.gz") "*The file to which icon images are stored. `twittering-icon-storage-limit' determines the number icons stored in the file. The file is loaded with `with-auto-compression-mode'." :group 'twittering-mode :type 'file) (defcustom twittering-use-icon-storage nil "*Whether to use the persistent icon storage. If this variable is non-nil, icon images are stored to the file specified by `twittering-icon-storage-file'." :group 'twittering-mode :type 'boolean) (defvar twittering-icon-storage-recent-icons nil "List of recently rendered icons.") (defcustom twittering-icon-storage-limit 500 "*How many icons are stored in the persistent storage. If `twittering-use-icon-storage' is nil, this variable is ignored. If a positive integer N, `twittering-save-icon-properties' saves N icons that have been recently rendered. If nil, the function saves all icons." :group 'twittering-mode :type '(choice (const nil) integer)) (defconst twittering-error-icon-data-pair '(xpm . "/* XPM */ static char * yellow3_xpm[] = { \"16 16 2 1\", \" c None\", \". c #FF0000\", \"................\", \". .\", \". . . .\", \". . . .\", \". . . .\", \". . . .\", \". . . .\", \". .. .\", \". .. .\", \". . . .\", \". . . .\", \". . . .\", \". . . .\", \". . . .\", \". .\", \"................\"}; ") "Image used when the valid icon cannot be retrieved.") (defun twittering-update-icon-storage-recent-icons (size image-url spec) (unless (null twittering-icon-storage-limit) (let ((dummy-icon-properties (twittering-make-display-spec-for-icon twittering-error-icon-data-pair))) (unless (equal spec dummy-icon-properties) (let ((history-delete-duplicates t)) (twittering-add-to-history 'twittering-icon-storage-recent-icons (list size image-url) twittering-icon-storage-limit)))))) (defun twittering-get-display-spec-for-icon (image-url) (let ((hash (gethash twittering-convert-fix-size twittering-icon-prop-hash))) (when hash (let ((spec (gethash image-url hash)) (size twittering-convert-fix-size)) (when spec (twittering-update-icon-storage-recent-icons size image-url spec) spec))))) (defun twittering-convert-image-data (image-data dest-type &optional src-type) "Convert IMAGE-DATA into XPM format and return it. If it fails to convert, return nil." (with-temp-buffer (set-buffer-multibyte nil) (buffer-disable-undo) (let ((coding-system-for-read 'binary) (coding-system-for-write 'binary) (require-final-newline nil) ;; Bind `default-directory' to the temporary directory ;; because it is possible that the directory pointed by ;; `default-directory' has been already removed. (default-directory temporary-file-directory)) (insert image-data) (let* ((args `(,@(when (<= emacs-major-version 22) ;; Emacs22 and earlier raises "Color allocation error" ;; on decoding a XPM image with opacity. To ignore ;; opacity, the option "+matte" is added. '("+matte")) ,@(unless (fboundp 'create-animated-image) '("-flatten")) ,(if src-type (format "%s:-" src-type) "-") ,@(when (integerp twittering-convert-fix-size) `("-resize" ,(format "%dx%d" twittering-convert-fix-size twittering-convert-fix-size))) ,(format "%s:-" dest-type))) (exit-status (apply 'call-process-region (point-min) (point-max) twittering-convert-program t `(t nil) nil args))) (if (equal 0 exit-status) (buffer-string) ;; failed to convert the image. nil))))) (defun twittering-create-image-pair (image-data) "Return a pair of image type and image data. IMAGE-DATA is converted by `convert' if the image type of IMAGE-DATA is not available and `twittering-use-convert' is non-nil." (let* ((image-type (and image-data (image-type-from-data image-data))) (image-pair `(,image-type . ,image-data)) (converted-size `(,twittering-convert-fix-size . ,twittering-convert-fix-size))) (cond ((null image-data) twittering-error-icon-data-pair) ((and (image-type-available-p image-type) (or (fboundp 'create-animated-image) (not (and twittering-use-convert (eq image-type 'gif)))) (or (not (integerp twittering-convert-fix-size)) (equal (image-size (create-image image-data image-type t) t) converted-size))) image-pair) (twittering-use-convert (let ((converted-data (twittering-convert-image-data image-data twittering-fallback-image-format))) (if converted-data `(,twittering-fallback-image-format . ,converted-data) twittering-error-icon-data-pair))) (t twittering-error-icon-data-pair)))) (defun twittering-register-image-spec (image-url spec size) (let ((hash (gethash size twittering-icon-prop-hash))) (unless hash (setq hash (make-hash-table :test 'equal)) (puthash size hash twittering-icon-prop-hash)) (puthash image-url spec hash))) (defun twittering-register-image-data (image-url image-data &optional size) (let ((image-pair (twittering-create-image-pair image-data)) (size (or size twittering-convert-fix-size))) (when image-pair (let ((spec (twittering-make-display-spec-for-icon image-pair))) (twittering-register-image-spec image-url spec size) spec)))) (defun twittering-make-slice-spec (image-spec) "Return slice property for reducing the image size by cropping it." (let* ((size (image-size image-spec t)) (width (car size)) (height (cdr size)) (fixed-length twittering-convert-fix-size) (half-fixed-length (/ fixed-length 2))) (if (or (< fixed-length width) (< fixed-length height)) `(slice ,(max 0 (- (/ width 2) half-fixed-length)) ,(max 0 (- (/ height 2) half-fixed-length)) ,fixed-length ,fixed-length) `(slice 0 0 ,fixed-length ,fixed-length)))) (defun twittering-make-display-spec-for-icon (image-pair) "Return the specification for `display' text property, which limits the size of an icon image IMAGE-PAIR up to FIXED-LENGTH. If the type of the image is not supported, nil is returned. If the size of the image exceeds FIXED-LENGTH, the center of the image are displayed." (let* ((type (car-safe image-pair)) (data (cdr-safe image-pair)) (raw-image-spec ;; without margins (create-image data type t)) (slice-spec (when (and twittering-convert-fix-size (not twittering-use-convert)) (twittering-make-slice-spec raw-image-spec))) (image-spec (if (fboundp 'create-animated-image) ;; Emacs24 or later (create-animated-image data type t :margin 2 :ascent 'center) (create-image data type t :margin 2 :ascent 'center)))) (if slice-spec `(display (,image-spec ,slice-spec)) `(display ,image-spec)))) (defun twittering-make-icon-string (beg end image-url) (let ((display-spec (twittering-get-display-spec-for-icon image-url)) (image-data (gethash image-url twittering-url-data-hash)) (properties (and beg (text-properties-at beg))) (icon-string (copy-sequence " "))) (when properties (add-text-properties 0 (length icon-string) properties icon-string)) (cond (display-spec (let ((icon-string (apply 'propertize "_" (append properties display-spec)))) ;; Remove the property required no longer. (remove-text-properties 0 (length icon-string) '(need-to-be-updated nil) icon-string) icon-string)) ((and (integerp image-data) (<= twittering-url-request-retry-limit image-data)) ;; Try to retrieve the image no longer. (twittering-register-image-data image-url nil) (twittering-make-icon-string beg end image-url)) ((and image-data (not (integerp image-data))) (twittering-register-image-data image-url image-data) (twittering-make-icon-string beg end image-url)) (t (put-text-property 0 (length icon-string) 'need-to-be-updated `(twittering-make-icon-string ,image-url) icon-string) (twittering-url-retrieve-async image-url 'twittering-register-image-data) icon-string)))) (defun twittering-save-icon-properties (&optional filename) (let ((filename (or filename twittering-icon-storage-file)) (stored-data (cond ((null twittering-icon-storage-limit) (let ((result nil) (dummy-icon-properties (twittering-make-display-spec-for-icon twittering-error-icon-data-pair))) (maphash (lambda (size hash) (maphash (lambda (url properties) (unless (equal properties dummy-icon-properties) (setq result (cons (list size url) result)))) hash)) twittering-icon-prop-hash) result)) (t (reverse twittering-icon-storage-recent-icons)))) ;; Bind `default-directory' to the temporary directory ;; because it is possible that the directory pointed by ;; `default-directory' has been already removed. (default-directory temporary-file-directory)) (when (require 'jka-compr nil t) (with-auto-compression-mode (let ((coding-system-for-write 'binary)) (with-temp-file filename (insert "( 2 ") (prin1 (cons 'emacs-version emacs-version) (current-buffer)) (insert "(icon-list ") (mapc (lambda (entry) (let* ((size (elt entry 0)) (url (elt entry 1)) (properties (gethash url (gethash size twittering-icon-prop-hash)))) (insert (if size (format "(%d " size) "(nil ")) (prin1 url (current-buffer)) (insert " ") (prin1 properties (current-buffer)) (insert ")\n"))) stored-data) (insert "))"))))))) (defun twittering-load-icon-properties (&optional filename) (let* ((filename (or filename twittering-icon-storage-file)) ;; Bind `default-directory' to the temporary directory ;; because it is possible that the directory pointed by ;; `default-directory' has been already removed. (default-directory temporary-file-directory) (data (with-temp-buffer (condition-case err (cond ((and (require 'jka-compr) (file-exists-p filename)) (with-auto-compression-mode (let ((coding-system-for-read 'binary) (coding-system-for-write 'binary)) (insert-file-contents filename))) (read (current-buffer))) (t nil)) (error (message "Failed to load icon images. %s" (cdr err)) nil))))) (cond ((equal 2 (car data)) (let ((version (cdr (assq 'emacs-version data)))) (cond ((or (equal version emacs-version) (y-or-n-p (format "%s is generated by Emacs %s! Use it?" filename version))) (mapc (lambda (entry) (let ((size (elt entry 0)) (url (elt entry 1)) (properties (elt entry 2))) (twittering-update-icon-storage-recent-icons size url properties) (twittering-register-image-spec url properties size))) (cdr (assq 'icon-list data)))) (t (message "Stopped loading icons"))))) (t (mapc (lambda (entry) (let ((size (car entry)) (prop-alist (cdr entry))) (mapc (lambda (entry) (let ((url (car entry)) (properties (cdr entry))) (twittering-update-icon-storage-recent-icons size url properties) (twittering-register-image-spec url properties size))) prop-alist))) data))))) ;;;; ;;;; Mode-line ;;;; ;;; SSL (defconst twittering-ssl-indicator-image (when (image-type-available-p 'xpm) '(image :type xpm :ascent center :data "/* XPM */ static char * lock[] = { \"16 16 3 1\", \" c None\", \". c #000000\", \"# c #FFFFFF\", \" \", \" \", \" ........ \", \" ..######.. \", \" .##....##. \", \" .#.. ..#. \", \" .#. .#. \", \" ..#......#.. \", \" .##########. \", \" .##########. \", \" .####..####. \", \" .###....###. \", \" .###....###. \", \" .##########. \", \" ............ \", \" \"}; " )) "Image for indicator of SSL state.") (defconst twittering-modeline-ssl (if twittering-ssl-indicator-image (propertize "SSL" 'display twittering-ssl-indicator-image 'help-echo "SSL is enabled.") "SSL")) ;;; ACTIVE/INACTIVE (defconst twittering-active-indicator-image (when (image-type-available-p 'xpm) '(image :type xpm :ascent center :data "/* XPM */ static char * connected[] = { \"16 16 3 1\", \" c None\", \". c #000000\", \"# c #FFFFFF\", \" .##. ... \", \" .##. .#. \", \" .##...#.. \", \" .##..###..\", \" .##..###..\", \" .##.#####.\", \" ... .##.#.#.#.\", \" .#. ..#...#...\", \"...#...#.. .#. \", \".#.#.#.##. .#. \", \".#####.##. ... \", \"..### .##. \", \" .###..##. \", \" ..#...##. \", \" .#. .##. \", \" ... .##. \"}; ")) "Image for indicator of active state." ) (defconst twittering-inactive-indicator-image (when (image-type-available-p 'xpm) '(image :type xpm :ascent center :data "/* XPM */ static char * disconnected[] = { \"16 16 3 1\", \" c None\", \". c #000000\", \"# c #FFFFFF\", \" .##. \", \" .##. \", \" . .##. \", \" ...##. \", \" ..##. \", \" ..#. \", \" .. ... \", \" .. .. \", \" .. .. \", \" ... .. \", \" .#.. \", \" .##.. \", \" .##... \", \" .##. . \", \" .##. \", \" .##. \"}; ")) "Image for indicator of inactive state." ) (defconst twittering-modeline-properties (when (display-mouse-p) `(local-map ,(purecopy (make-mode-line-mouse-map 'mouse-2 #'twittering-toggle-activate-buffer)) help-echo "mouse-2 toggles activate buffer"))) (defconst twittering-modeline-active (if twittering-active-indicator-image (apply 'propertize " " `(display ,twittering-active-indicator-image ,@twittering-modeline-properties)) " ")) (defconst twittering-modeline-inactive (if twittering-inactive-indicator-image (apply 'propertize "INACTIVE" `(display ,twittering-inactive-indicator-image ,@twittering-modeline-properties)) "INACTIVE")) (defun twittering-mode-line-buffer-identification () (let ((active-mode-indicator (if twittering-active-mode twittering-modeline-active twittering-modeline-inactive)) (enabled-options `(,(if twittering-display-connection-method (concat (when twittering-use-ssl (concat twittering-modeline-ssl ":")) (twittering-get-connection-method-name twittering-use-ssl)) (when twittering-use-ssl twittering-modeline-ssl)) ,@(when twittering-jojo-mode '("jojo")) ,@(when twittering-icon-mode '("icon")) ,@(when twittering-reverse-mode '("reverse")) ,@(when twittering-proxy-use '("proxy"))))) (concat active-mode-indicator (when twittering-display-remaining (let ((spec (twittering-current-timeline-spec))) (twittering-get-ratelimit-indicator-string spec))) (when enabled-options (concat "[" (mapconcat 'identity enabled-options " ") "]"))))) (defun twittering-update-mode-line () "Update mode line." (force-mode-line-update)) ;;;; ;;;; Format of a status ;;;; (eval-and-compile (defsubst twittering-make-common-properties (status) "Generate a property list that tweets should have irrespective of format." (apply 'append (mapcar (lambda (entry) (let ((prop-sym (if (consp entry) (car entry) entry)) (status-sym (if (consp entry) (cdr entry) entry))) (list prop-sym (cdr (assq status-sym status))))) '(id retweeted-id source-spec (username . user-screen-name) text))))) (defun twittering-get-common-properties (pos) "Get a common property list of the tweet rendered at POS. The common property list is added to each rendered tweet irrespective of format. The common properties follows: properites generated by `twittering-make-common-properties', `field' and `rendered-as' generated by `twittering-render-a-field' or `twittering-make-properties-of-popped-ancestors'." (apply 'append (mapcar (lambda (prop) (let ((value (get-text-property pos prop))) (when value `(,prop ,value)))) '(field id rendered-as retweeted-id source-spec text username)))) (defun twittering-format-string (string prefix replacement-table) "Format STRING according to PREFIX and REPLACEMENT-TABLE. PREFIX is a regexp. REPLACEMENT-TABLE is a list of (FROM . TO) pairs, where FROM is a regexp and TO is a string or a 2-parameter function. The pairs in REPLACEMENT-TABLE are stored in order of precedence. First, search PREFIX in STRING from left to right. If PREFIX is found in STRING, try to match the following string with FROM of each pair in the same order of REPLACEMENT-TABLE. If FROM in a pair is matched, replace the prefix and the matched string with a string generated from TO. If TO is a string, the matched string is replaced with TO. If TO is a function, the matched string is replaced with the return value of (funcall TO CONTEXT), where CONTEXT is an alist. Each element of CONTEXT is (KEY . VALUE) and KEY is one of the following symbols; 'following-string --the matched string following the prefix 'match-data --the match-data for the regexp FROM. 'prefix --PREFIX. 'replacement-table --REPLACEMENT-TABLE. 'from --FROM. 'processed-string --the already processed string." (let ((current-pos 0) (result "") (case-fold-search nil)) (while (and (string-match prefix string current-pos) (not (eq (match-end 0) current-pos))) (let ((found nil) (current-table replacement-table) (next-pos (match-end 0)) (matched-string (match-string 0 string)) (skipped-string (substring string current-pos (match-beginning 0)))) (setq result (concat result skipped-string)) (setq current-pos next-pos) (while (and (not (null current-table)) (not found)) (let ((key (caar current-table)) (value (cdar current-table)) (following-string (substring string current-pos)) (case-fold-search nil)) (if (string-match (concat "\\`" key) following-string) (let ((next-pos (+ current-pos (match-end 0))) (output (if (stringp value) value (funcall value `((following-string . ,following-string) (match-data . ,(match-data)) (prefix . ,prefix) (replacement-table . ,replacement-table) (from . ,key) (processed-string . ,result)))))) (setq found t) (setq current-pos next-pos) (setq result (concat result output))) (setq current-table (cdr current-table))))) (if (not found) (setq result (concat result matched-string))))) (let ((skipped-string (substring string current-pos))) (concat result skipped-string)) )) (eval-and-compile (defsubst twittering-make-string-with-user-name-property (str status) (if str (let* ((user-screen-name (cdr (assq 'user-screen-name status))) (uri (twittering-get-status-url user-screen-name)) (spec (twittering-make-user-timeline-spec-direct user-screen-name))) (propertize str 'mouse-face 'highlight 'keymap twittering-mode-on-uri-map 'uri uri 'screen-name-in-text user-screen-name 'goto-spec spec 'face 'twittering-username-face 'front-sticky nil 'rear-nonsticky t)) "")) (defsubst twittering-make-string-with-source-property (str status) (if str (let ((uri (cdr (assq 'source-uri status)))) (propertize str 'mouse-face 'highlight 'keymap twittering-mode-on-uri-map 'uri uri 'face 'twittering-uri-face 'source str 'front-sticky nil 'rear-nonsticky t)) "")) (defsubst twittering-make-string-with-uri-property (str status) (if str (let ((uri (if (assq 'retweeted-id status) (twittering-get-status-url (cdr (assq 'retweeted-user-screen-name status)) (cdr (assq 'retweeted-id status))) (twittering-get-status-url (cdr (assq 'user-screen-name status)) (cdr (assq 'id status)))))) (propertize str 'mouse-face 'highlight 'keymap twittering-mode-on-uri-map 'uri uri 'face 'twittering-uri-face 'front-sticky nil 'rear-nonsticky t)) ""))) (defun twittering-make-fontified-tweet-text (str-expr regexp-hash regexp-atmark) (let ((regexp-str (mapconcat 'identity (list ;; hashtag (concat regexp-hash "\\([[:alpha:]0-9_-]+\\)") ;; @USER/LIST (concat regexp-atmark "\\(\\([a-zA-Z0-9_-]+\\)/\\([a-zA-Z0-9_-]+\\)\\)") ;; @USER (concat regexp-atmark "\\([a-zA-Z0-9_-]+\\)") ;; URI "\\(https?://[-_.!~*'()a-zA-Z0-9;/?:@&=+$,%#]+\\)") "\\|"))) `(let ((pos 0) (str (copy-sequence ,str-expr))) (while (string-match ,regexp-str str pos) (let* ((beg (match-beginning 0)) (end (match-end 0)) (range-and-properties (cond ((get-text-property beg 'face str) ;; The matched substring has been already fontified. ;; The fontification with entities must fontify the ;; head of the matched string. nil) ((match-string 1 str) ;; hashtag (let* ((hashtag (match-string 1 str)) (spec-string (twittering-make-hashtag-timeline-spec-string-direct hashtag)) (url (twittering-get-search-url (concat "#" hashtag)))) (list beg end 'mouse-face 'highlight 'keymap twittering-mode-on-uri-map 'uri url 'goto-spec spec-string 'face 'twittering-username-face))) ((match-string 2 str) ;; @USER/LIST (let ((owner (match-string 3 str)) (list-name (match-string 4 str)) ;; Properties are added to the matched part only. ;; The prefixes `twittering-regexp-atmark' will not ;; be highlighted. (beg (match-beginning 2))) (list beg end 'mouse-face 'highlight 'keymap twittering-mode-on-uri-map 'uri (twittering-get-list-url owner list-name) 'goto-spec (twittering-make-list-timeline-spec-direct owner list-name) 'face 'twittering-username-face))) ((match-string 5 str) ;; @USER (let ((screen-name (match-string 5 str)) ;; Properties are added to the matched part only. ;; The prefixes `twittering-regexp-atmark' will not ;; be highlighted. (beg (match-beginning 5))) (list beg end 'mouse-face 'highlight 'keymap twittering-mode-on-uri-map 'uri (twittering-get-status-url screen-name) 'screen-name-in-text screen-name 'goto-spec (twittering-make-user-timeline-spec-direct screen-name) 'face 'twittering-uri-face))) ((match-string 6 str) ;; URI (let ((uri (match-string 6 str))) (list beg end 'mouse-face 'highlight 'keymap twittering-mode-on-uri-map 'uri uri 'uri-origin 'explicit-uri-in-tweet 'face 'twittering-uri-face))))) (beg (if range-and-properties (car range-and-properties) beg)) (end (if range-and-properties (cadr range-and-properties) end)) (properties `(,@(cddr range-and-properties) front-sticky nil rear-nonsticky t))) (when range-and-properties (add-text-properties beg end properties str)) (setq pos end))) str))) (eval-and-compile (defsubst twittering-make-fontified-tweet-text-with-entity (status) (let* ((text (copy-sequence (cdr (assq 'text status)))) (text-length (length text)) (entities (cdr (assq 'entity status)))) ;; hashtags (mapc (lambda (hashtag) (let* ((start (cdr (assq 'start hashtag))) (end (min (cdr (assq 'end hashtag)) text-length)) (tag (cdr (assq 'text hashtag))) (spec-string (twittering-make-hashtag-timeline-spec-string-direct tag))) (set-text-properties start end `(mouse-face highlight keymap ,twittering-mode-on-uri-map uri ,(twittering-get-search-url (concat "#" tag)) goto-spec ,spec-string face twittering-username-face front-sticky nil rear-nonsticky t) text))) (cdr (assq 'hashtags entities))) ;; mentions (mapc (lambda (mention) (let ((start (cdr (assq 'start mention))) (end (min (cdr (assq 'end mention)) text-length)) (screen-name (cdr (assq 'screen-name mention)))) (set-text-properties start end `(mouse-face highlight keymap ,twittering-mode-on-uri-map uri ,(twittering-get-status-url screen-name) screen-name-in-text ,screen-name goto-spec ,(twittering-make-user-timeline-spec-direct screen-name) face twittering-uri-face front-sticky nil rear-nonsticky t) text))) (cdr (assq 'mentions entities))) ;; urls (let ((offset 0)) (mapc (lambda (url-info) (let* ((text-length (length text)) (start (cdr (assq 'start url-info))) (end (cdr (assq 'end url-info))) (url (cdr (assq 'url url-info))) (expanded-url ;; If the `url' is short and not wrapped, ;; `expanded-url' is nil. (or (cdr (assq 'expanded-url url-info)) url)) (replacement (propertize expanded-url 'mouse-face 'highlight 'keymap twittering-mode-on-uri-map 'uri url 'uri-origin 'explicit-uri-in-tweet 'expanded-uri expanded-url 'face 'twittering-uri-face 'front-sticky nil 'rear-nonsticky t))) (setq text (concat (substring text 0 (min (+ offset start) text-length)) replacement (substring text (min (+ offset end) text-length)))) (setq offset (+ offset (- (length expanded-url) (- end start)))))) (cdr (assq 'urls entities)))) text))) (defun twittering-generate-format-table (status-sym prefix-sym) `(("%" . "%") ("}" . "}") ("#" . (cdr (assq 'id ,status-sym))) ("'" . (when (cdr (assq 'truncated ,status-sym)) "...")) ("c" . (let ((system-time-locale "C")) (format-time-string "%a %b %d %H:%M:%S %z %Y" (cdr (assq 'created-at ,status-sym))))) ("d" . (cdr (assq 'user-description ,status-sym))) ("f" . (twittering-make-string-with-source-property (cdr (assq 'source ,status-sym)) ,status-sym)) ("i" . (when (and twittering-icon-mode window-system) (let ((url (cond ((and twittering-use-profile-image-api (eq twittering-service-method 'twitter) (or (null twittering-convert-fix-size) (member twittering-convert-fix-size '(48 73)))) (let ((user (cdr (assq 'user-screen-name ,status-sym))) (size (if (or (null twittering-convert-fix-size) (= 48 twittering-convert-fix-size)) "normal" "bigger"))) (format "http://%s/%s/%s.xml?size=%s" twittering-api-host (twittering-api-path "users/profile_image") user size))) (t (cdr (assq 'user-profile-image-url ,status-sym)))))) (twittering-make-icon-string nil nil url)))) ("j" . (cdr (assq 'user-id ,status-sym))) ("L" . (let ((location (or (cdr (assq 'user-location ,status-sym)) ""))) (unless (string= "" location) (concat " [" location "]")))) ("l" . (cdr (assq 'user-location ,status-sym))) ("p" . (when (cdr (assq 'user-protected ,status-sym)) "[x]")) ("r" . (let ((reply-id (or (cdr (assq 'in-reply-to-status-id ,status-sym)) "")) (reply-name (or (cdr (assq 'in-reply-to-screen-name ,status-sym)) "")) (recipient-screen-name (cdr (assq 'recipient-screen-name ,status-sym)))) (let* ((pair (cond (recipient-screen-name (cons (format "sent to %s" recipient-screen-name) (twittering-get-status-url recipient-screen-name))) ((and (not (string= "" reply-id)) (not (string= "" reply-name))) (cons (format "in reply to %s" reply-name) (twittering-get-status-url reply-name reply-id))) (t nil))) (str (car pair)) (url (cdr pair)) (properties (list 'mouse-face 'highlight 'face 'twittering-uri-face 'keymap twittering-mode-on-uri-map 'uri url 'front-sticky nil 'rear-nonsticky t))) (when (and str url) (concat " " (apply 'propertize str properties)))))) ("R" . (let ((retweeted-by (or (cdr (assq 'retweeting-user-screen-name ,status-sym)) ""))) (unless (string= "" retweeted-by) (concat " (retweeted by " retweeted-by ")")))) ("S" . (twittering-make-string-with-user-name-property (cdr (assq 'user-name ,status-sym)) ,status-sym)) ("s" . (twittering-make-string-with-user-name-property (cdr (assq 'user-screen-name ,status-sym)) ,status-sym)) ("T" . ,(twittering-make-fontified-tweet-text `(twittering-make-fontified-tweet-text-with-entity ,status-sym) twittering-regexp-hash twittering-regexp-atmark)) ("t" . ,(twittering-make-fontified-tweet-text `(twittering-make-fontified-tweet-text-with-entity ,status-sym) twittering-regexp-hash twittering-regexp-atmark)) ("u" . (cdr (assq 'user-url ,status-sym))))) (defun twittering-generate-formater-for-first-spec (format-str status-sym prefix-sym) (cond ((string-match "\\`}" format-str) ;; "}" at the first means the end of the current level. `(nil . ,(substring format-str (match-end 0)))) ((string-match "\\`%" format-str) (let* ((following (substring format-str 1)) (table (twittering-generate-format-table status-sym prefix-sym)) (regexp (concat "\\`\\(" (mapconcat 'car table "\\|") "\\)")) (case-fold-search nil)) (cond ((string-match "\\`@\\({\\([^}]*\\)}\\)?" following) (let ((time-format (or (match-string 2 following) "%I:%M %p %B %d, %Y")) (rest (substring following (match-end 0)))) `((let* ((created-at (cdr (assq 'created-at ,status-sym))) (url (if (assq 'retweeted-id ,status-sym) (twittering-get-status-url (cdr (assq 'retweeted-user-screen-name ,status-sym)) (cdr (assq 'retweeted-id ,status-sym))) (twittering-get-status-url (cdr (assq 'user-screen-name ,status-sym)) (cdr (assq 'id ,status-sym))))) (properties (list 'mouse-face 'highlight 'face 'twittering-uri-face 'keymap twittering-mode-on-uri-map 'uri url 'front-sticky nil 'rear-nonsticky t))) (twittering-make-passed-time-string nil nil created-at ,time-format properties)) . ,rest))) ((string-match "\\`C\\({\\([^}]*\\)}\\)?" following) (let ((time-format (or (match-string 2 following) "%H:%M:%S")) (rest (substring following (match-end 0)))) `((let* ((created-at (cdr (assq 'created-at ,status-sym)))) (twittering-make-string-with-uri-property (format-time-string ,time-format created-at) ,status-sym)) . ,rest))) ((string-match "\\`FACE\\[\\([a-zA-Z0-9:-]+\\)\\]{" following) (let* ((face-name-str (match-string 1 following)) (str-after-brace (substring following (match-end 0))) (face-sym (intern face-name-str)) (pair (twittering-generate-formater-for-current-level str-after-brace status-sym prefix-sym)) (braced-body (car pair)) (rest (cdr pair))) `((propertize (concat ,@braced-body) 'face ',face-sym) . ,rest))) ((string-match "\\`FIELD\\(\\[\\([^]]*\\)\\]\\)?{\\([a-z_]*\\)}" following) (let* ((format-str (or (match-string 2 following) "%s")) (field-raw-name (match-string 3 following)) (field-name (replace-regexp-in-string "_" "-" field-raw-name)) (field-symbol (intern field-name)) (rest (substring following (match-end 0)))) `((let* ((field-value (cdr (assq ',field-symbol ,status-sym)))) (if field-value (format ,format-str field-value) "")) . ,rest))) ((string-match "\\`FIELD-IF-NONZERO\\(\\[\\([^]]*\\)\\]\\)?{\\([a-z_]*\\)}" following) (let* ((format-str (or (match-string 2 following) "%s")) (field-raw-name (match-string 3 following)) (field-name (replace-regexp-in-string "_" "-" field-raw-name)) (field-symbol (intern field-name)) (rest (substring following (match-end 0)))) `((let* ((field-value (cdr (assq ',field-symbol ,status-sym)))) (if (and (integerp field-value) (not (zerop field-value))) (format ,format-str field-value) "")) . ,rest))) ((string-match "\\`\\(FILL\\|FOLD\\)\\(\\[\\([^]]*\\)\\]\\)?{" following) (let* ((str-after-brace (substring following (match-end 0))) (specifier (match-string 1 following)) (prefix-str (match-string 3 following)) (pair (twittering-generate-formater-for-current-level str-after-brace status-sym prefix-sym)) (filled-body (car pair)) (formater `(lambda (,status-sym ,prefix-sym) (let ((,prefix-sym (concat ,prefix-sym ,prefix-str))) (concat ,@filled-body)))) (keep-newline (string= "FOLD" specifier)) (rest (cdr pair))) `((twittering-update-filled-string nil nil ,formater ,status-sym ,prefix-sym ,prefix-str ,keep-newline) . ,rest))) ((string-match "\\`RT{" following) (let* ((str-after-brace (substring following (match-end 0))) (pair (twittering-generate-formater-for-current-level str-after-brace 'retweeting prefix-sym)) (braced-body (car pair)) (rest (cdr pair))) `((when (assq 'retweeted-id ,status-sym) (let ((retweeting (mapcar (lambda (entry) (let ((key-str (symbol-name (car entry))) (value (cdr entry))) (when (string-match "\\`retweeting-" key-str) (let ((new-key (intern (substring key-str (match-end 0))))) (cons new-key value))))) ,status-sym))) (concat ,@braced-body))) . ,rest))) ((string-match "\\`QT{" following) (let* ((str-after-brace (substring following (match-end 0))) (pair (twittering-generate-formater-for-current-level str-after-brace 'quoted prefix-sym)) (braced-body (car pair)) (rest (cdr pair))) `((when (assq 'quoted-status ,status-sym) (let ((quoted (cdr (assq 'quoted-status ,status-sym)))) (concat ,@braced-body))) . ,rest))) ((string-match regexp following) (let ((specifier (match-string 1 following)) (rest (substring following (match-end 0)))) `(,(cdr (assoc specifier table)) . ,rest))) (t `("%" . ,following))))) ((string-match "\\(%\\|}\\)" format-str) (let* ((sep (match-beginning 0)) (first (substring format-str 0 sep)) (last (substring format-str sep))) ;; Split before "%" or "}". `(,first . ,last))) (t `(,format-str . nil)))) (defun twittering-generate-formater-for-current-level (format-str status-sym prefix-sym) (let ((result nil) (rest format-str) (continue t)) (while (and continue rest) (let* ((pair (twittering-generate-formater-for-first-spec rest status-sym prefix-sym)) (current-result (car pair))) (if current-result (setq result (append result `(,current-result))) ;; If `result' is nil, it means the end of the current level. (setq continue nil)) (setq rest (cdr pair)))) `(,result . ,rest))) (defun twittering-generate-format-status-function (format-str) (let* ((status-sym 'status) (prefix-sym 'prefix) (pair (twittering-generate-formater-for-current-level format-str status-sym prefix-sym)) (body (car pair)) (rest (cdr pair))) (cond ((null rest) `(lambda (status prefix) (let* ((common-properties (twittering-make-common-properties status)) (str (concat ,@body)) (str (if prefix (replace-regexp-in-string "^" prefix str) str)) (next (next-single-property-change 0 'need-to-be-updated str)) (need-to-be-updated (or (get-text-property 0 'need-to-be-updated str) (and next (< next (length str)))))) (add-text-properties 0 (length str) common-properties str) (when (and prefix need-to-be-updated) ;; With a prefix, redisplay the total status instead of ;; redisplaying partially. (remove-text-properties 0 (length str) '(need-to-be-updated nil) str) (put-text-property 0 (length str) 'need-to-be-updated `(twittering-format-status-for-redisplay ,status ,prefix) str)) str))) (t (message "Failed to generate a status formater for `twittering-mode'.") nil)))) (defun twittering-update-status-format (&optional format-str) "Update the format for rendering a tweet. If FORMAT-STR is nil, `twittering-status-format' is used in place of FORMAT-STR. If FORMAT-STR is valid as a format, `twittering-format-status-function' is replaced by the result of `twittering-generate-format-status-function' for FORMAT-STR. If FORMAT-STR is invalid as a format, an error is signaled and `twittering-format-status-function' is not updated." (let ((format-str (or format-str twittering-status-format))) (unless (string= format-str twittering-format-status-function-source) (let* ((before (get-buffer "*Compile-Log*")) (func (twittering-generate-format-status-function format-str))) (cond ((and func (functionp func)) (setq twittering-format-status-function-source format-str) (setq twittering-format-status-function (byte-compile func)) (setq twittering-format-status-function-without-compile func) (setq twittering-status-format format-str) (let ((current (get-buffer "*Compile-Log*"))) (when (and (null before) current (= 0 (buffer-size current))) (kill-buffer current)))) (t (error "Invalid format: %s" format-str) nil)))))) (defun twittering-format-status (status &optional prefix) "Format a STATUS by using `twittering-format-status-function'. PREFIX is the prefix that will be added to the result of this function. PREFIX is used in order to calculate appropriate width for filling texts. Specification of the format is described in the document for the variable `twittering-status-format'." (funcall twittering-format-status-function status prefix)) (defun twittering-format-status-for-redisplay (beg end status &optional prefix) (twittering-format-status status prefix)) ;;;; ;;;; Rendering ;;;; (defun twittering-field-id< (field1 field2) (string< field1 field2)) (defun twittering-field-id= (field1 field2) (string= field1 field2)) (defun twittering-make-field-id-from-id (id &optional base-id) "Generate a field property for the tweet corresponding to ID. Tweets are rendered in order of the field on `twittering-mode'. If BASE-ID is non-nil, generate a field id for a tweet rendered as a popped ancestor tweet by `twittering-show-replied-statuses'. In the case, BASE-ID means the ID of the descendant." (let ((format-func (lambda (id) (format "%02d-%s" (length id) id)))) (cond (base-id (format "O:%s:5:ancestor:%s" (funcall format-func base-id) (funcall format-func id))) (t (format "O:%s:8" (funcall format-func id)))))) (defun twittering-make-field-id (status &optional base-id) "Generate a field property for STATUS. Tweets are rendered in order of the field on `twittering-mode'. If BASE-ID is non-nil, generate a field id for a tweet rendered as a popped ancestor tweet by `twittering-show-replied-statuses'. In the case, BASE-ID means the ID of the descendant." (let ((id (cdr (assq 'id status)))) (twittering-make-field-id-from-id id base-id))) (defun twittering-make-properties-of-popped-ancestors (base-id) `(rendered-as ((ancestor-of . ,base-id)))) (defun twittering-make-field-id-of-timeline-oldest-end (spec-string) "Return the field ID for the oldest end. This is given to a special field, header or footer, which does not correspond to a tweet. It must be less than IDs made by `twittering-make-field-id' for any other normal fields in the meaning of `twittering-field-id<'." (format "H:%s" spec-string)) (defun twittering-make-field-id-of-timeline-latest-end (spec-string) "Return the field ID for the oldest end. This is given to a special field, header or footer, which does not correspond to a tweet. It must be greater than IDs made by `twittering-make-field-id' for any other normal fields in the meaning of `twittering-field-id<'." (format "U:%s" spec-string)) (defun twittering-field-id-is-timeline-oldest-end (field-id) "Return non-nil if FIELD-ID corresponds to the oldest end field. Return non-nil if FIELD-ID is made by `twittering-make-field-id-of-timeline-oldest-end'." (and (stringp field-id) (string= (substring field-id 0 2) "H:"))) (defun twittering-field-id-is-timeline-latest-end (field-id) "Return non-nil if FIELD-ID corresponds to the latest end field. Return non-nil if FIELD-ID is made by `twittering-make-field-id-of-timeline-latest-end'." (and (stringp field-id) (string= (substring field-id 0 2) "U:"))) (defun twittering-rendered-as-ancestor-status-p (&optional pos) "Return non-nil if the status at POS is rendered as an ancestor. Ancestor statuses are rendered by `twittering-show-replied-statuses'." (let ((pos (or pos (point)))) (assq 'ancestor-of (get-text-property pos 'rendered-as)))) (defun twittering-get-base-id-of-ancestor-at (&optional pos) "Return the base ID of a popped ancestor status rendered at POS. If the status at POS is not a popped ancestor status or no status is rendered at POS, return nil." (let ((pos (or pos (point)))) (cdr (assq 'ancestor-of (get-text-property pos 'rendered-as))))) (eval-and-compile (defsubst twittering-fill-string (str &optional adjustment prefix keep-newline) (when (and (not (boundp 'kinsoku-limit)) enable-kinsoku) ;; `kinsoku-limit' is defined on loading "international/kinsoku.el". ;; Without preloading, "kinsoku.el" will be loaded by auto-loading ;; triggered by `fill-region-as-paragraph'. ;; In that case, the local binding of `kinsoku-limit' conflicts the ;; definition by `defvar' in "kinsoku.el". ;; The below warning is displayed; ;; "Warning: defvar ignored because kinsoku-limit is let-bound". ;; So, we load "kinsoku.el" in advance if necessary. (load "international/kinsoku")) (let* ((kinsoku-limit 1) (adjustment (+ (or adjustment 0) (if enable-kinsoku kinsoku-limit 0))) (min-width (apply 'min (or (mapcar 'window-width (get-buffer-window-list (current-buffer) nil t)) ;; Use `(frame-width)' if no windows display ;; the current buffer. `(,(frame-width))))) (temporary-fill-column (- (or twittering-fill-column (1- min-width)) adjustment))) (with-temp-buffer (let ((fill-column temporary-fill-column) (fill-prefix (or prefix fill-prefix)) (adaptive-fill-regexp "")) (if keep-newline (let* ((hard-newline (propertize "\n" 'hard t)) (str (mapconcat 'identity (split-string str "\n") (concat hard-newline fill-prefix)))) (use-hard-newlines) (insert (concat prefix str)) (fill-region (point-min) (point-max) nil t) (remove-text-properties (point-min) (point-max) '(hard nil))) (insert (concat prefix str)) (fill-region-as-paragraph (point-min) (point-max))) (buffer-substring (point-min) (point-max)))))) (defsubst twittering-update-filled-string (beg end formater status prefix local-prefix &optional keep-newline) (let* ((str (twittering-fill-string (funcall formater status prefix) (length prefix) local-prefix keep-newline)) (next (next-single-property-change 0 'need-to-be-updated str))) (if (or (get-text-property 0 'need-to-be-updated str) (and next (< next (length str)))) (put-text-property 0 (length str) 'need-to-be-updated `(twittering-update-filled-string ,formater ,status ,prefix ,local-prefix ,keep-newline) str) ;; Remove the property required no longer. (remove-text-properties 0 (length str) '(need-to-be-updated nil) str)) str)) (defsubst twittering-make-passed-time-string (beg end encoded-created-at time-format &optional additional-properties) (let* ((now (current-time)) (secs (+ (* (- (car now) (car encoded-created-at)) 65536) (- (cadr now) (cadr encoded-created-at)))) (time-string (cond ((< secs 5) "less than 5 seconds ago") ((< secs 10) "less than 10 seconds ago") ((< secs 20) "less than 20 seconds ago") ((< secs 30) "half a minute ago") ((< secs 60) "less than a minute ago") ((< secs 150) "1 minute ago") ((< secs 2400) (format "%d minutes ago" (/ (+ secs 30) 60))) ((< secs 5400) "about 1 hour ago") ((< secs 84600) (format "about %d hours ago" (/ (+ secs 1800) 3600))) (t (format-time-string time-format encoded-created-at)))) (properties (append additional-properties (and beg (text-properties-at beg)))) (time-string ;; Copy a string and restore properties. (apply 'propertize time-string properties))) (if (< secs 84600) (put-text-property 0 (length time-string) 'need-to-be-updated `(twittering-make-passed-time-string ,encoded-created-at ,time-format) time-string) ;; Remove the property required no longer. (remove-text-properties 0 (length time-string) '(need-to-be-updated nil) time-string)) time-string))) (defmacro twittering-render-a-field (pos field-id generator &optional without-separator) "Render a field on the current buffer managed by `twittering-mode'. Insert a field to the position pointed by FIELD-ID. The position is searched after POS. The string for the field is generated by the GENERATOR expression. This function does not render the status if a status with the same field ID as FIELD-ID is already rendered. Return non-nil if the status is rendered. Otherwise, return nil." `(lexical-let ((pos ,pos) (field-id ,field-id)) (while (let ((buf-field-id (get-text-property pos 'field))) (if (and buf-field-id (if twittering-reverse-mode (twittering-field-id< buf-field-id field-id) (twittering-field-id< field-id buf-field-id))) (let ((next-pos (twittering-get-next-status-head pos))) (setq pos (or next-pos (point-max))) next-pos) nil))) (goto-char pos) (unless (twittering-field-id= field-id (get-text-property pos 'field)) (let ((formatted-status (propertize ,generator 'field ,field-id)) (separator (if ,without-separator "" "\n"))) (if (eq pos (point-max)) ;; Use `insert' only if no statuses are rendered on the below. (insert formatted-status separator) ;; Use `insert-before-markers' in order to keep ;; which status is pointed by each marker. (insert-before-markers formatted-status separator)) t)))) (defun twittering-render-timeline (buffer timeline-data &optional invoke-hook keep-point) "Render statuses for BUFFER and return the list of the rendered statuses. TIMELINE-DATA is a list of statuses being rendered. If INVOKE-HOOK is non-nil and one or more tweets are rendered, run hooks specified by `twittering-new-tweets-rendered-hook'. If KEEP-POINT is nil and BUFFER is empty, this function moves cursor positions to the latest status. This function returns a list of the statuses newly rendered by the invocation." (with-current-buffer buffer (let* ((spec (twittering-get-timeline-spec-for-buffer buffer)) (referring-id-table (twittering-current-timeline-referring-id-table spec)) (current-user (twittering-get-username)) (timeline-data ;; Collect visible statuses. (let ((prev-id nil)) (remove nil (mapcar (lambda (status) (let ((id (cdr (assq 'id status))) (retweeted-id (cdr (assq 'retweeted-id status)))) (if (twittering-status-id= prev-id id) ;; `status' is equivalent the previous one. nil (setq prev-id id) (cond ((null retweeted-id) ;; `status' is not a retweet. status) ((and retweeted-id (twittering-status-id= id (gethash retweeted-id referring-id-table))) ;; `status' is the first retweet. status) ((and retweeted-id (string= (cdr (assq 'retweeting-user-screen-name status)) current-user)) ;; `status' is retweeted by the current account. status) ((null (gethash retweeted-id referring-id-table)) ;; If the first ID referring the retweet is unknown, ;; render it. ;; This is necessary because a referring ID table ;; of a composite timeline may lack information of ;; some component timelines. status) (t ;; Otherwise, do not render it. nil))))) timeline-data)))) (timeline-data (if twittering-reverse-mode (reverse timeline-data) timeline-data)) (rendering-entire (null (twittering-get-first-status-head))) (result-tweets nil) (buffer-read-only nil)) (twittering-update-status-format) (twittering-update-mode-line) (save-excursion (let ((pos (point-min)) (spec-string (twittering-get-timeline-spec-string-for-buffer buffer))) (cond (rendering-entire (let* ((latest-id (twittering-make-field-id-of-timeline-latest-end spec-string)) (oldest-id (twittering-make-field-id-of-timeline-oldest-end spec-string)) (footer-id (if twittering-reverse-mode latest-id oldest-id)) (header-id (if twittering-reverse-mode oldest-id latest-id))) (setq pos (let ((footer ;; To avoid adding a face to newlines. (mapconcat (lambda (substr) (propertize substr 'face twittering-timeline-footer-face)) (split-string (or twittering-timeline-footer "") "\n") "\n")) (header ;; To avoid adding a face to newlines. (mapconcat (lambda (substr) (propertize substr 'face twittering-timeline-header-face)) (split-string (or twittering-timeline-header "") "\n") "\n"))) (twittering-render-a-field (point-min) footer-id footer t) (twittering-render-a-field (point-min) header-id header t) (point))))) (t (setq pos (twittering-get-first-status-head)))) (goto-char pos) (let* ((rendered-tweets (remove nil (mapcar (lambda (status) (when (twittering-render-a-field (point) (twittering-make-field-id status) (twittering-format-status status)) (when twittering-default-show-replied-tweets (twittering-show-replied-statuses twittering-default-show-replied-tweets)) status)) timeline-data))) (twittering-rendered-new-tweets (if twittering-reverse-mode (reverse rendered-tweets) rendered-tweets)) (twittering-rendered-new-tweets-spec spec) (twittering-rendered-new-tweets-spec-string spec-string)) (setq result-tweets rendered-tweets) (when (and invoke-hook twittering-rendered-new-tweets) (run-hooks 'twittering-new-tweets-rendered-hook))))) (debug-print (current-buffer)) (cond ((and (not keep-point) rendering-entire) ;; Go to the latest status of buffer after full insertion. (let ((dest (if twittering-reverse-mode (or (twittering-get-last-normal-field-head) (twittering-get-last-status-head) (point-max)) (or (twittering-get-first-normal-field-head) (twittering-get-first-status-head) (point-min)))) (window-list (get-buffer-window-list (current-buffer) nil t))) (if window-list (mapc (lambda (window) (set-window-point window dest) (if twittering-reverse-mode (twittering-set-window-end window (point-max)) (set-window-start window (point-min)))) window-list) ;; Move the buffer position if the buffer is invisible. (goto-char dest)))) ) result-tweets) )) (defun twittering-rerender-timeline-all (buffer &optional restore-point) "Re-render statuses on BUFFER after clearing BUFFER. If RESTORE-POINT is non-nil, positions on buffers bound to the same timeline will be restored after rendering statuses." (with-current-buffer buffer (let* ((window-list (get-buffer-window-list (current-buffer) nil t)) (point-window-list (mapcar (lambda (window) (cons (window-point window) window)) window-list)) (original-pos (point))) (let ((buffer-read-only nil)) (erase-buffer)) (twittering-render-timeline (current-buffer) (twittering-current-timeline-data) nil restore-point) (when restore-point ;; Restore points. (mapc (lambda (pair) (let* ((point (car pair)) (window (cdr pair)) (dest (max (point-max) point))) (set-window-point window dest))) point-window-list) (goto-char original-pos))))) (defun twittering-retrieve-timeline (spec-string noninteractive api-arguments additional-info) "Retrieve and render a timeline specified by SPEC-STRING. Retrieve a timeline specified by SPEC-STRING, which must be a timeline spec string. Any timeline spec string including that for composite timeline can be used as SPEC-STRING, though the primitive function `twittering-call-api' accepts only a spec of a primary timeline. NONINTERACTIVE is sent to the sentinel as a parameter `noninteractive' via an argument `additional-info' of `twittering-call-api'. API-ARGUMENTS is also sent to `twittering-call-api' as its argument `args-alist'." (let ((spec (twittering-string-to-timeline-spec spec-string))) (cond ((not (twittering-account-authorized-p)) ;; ignore any requests if the account has not been authorized. (message "No account for Twitter has been authorized.") t) ((and noninteractive (twittering-process-active-p spec)) ;; ignore non-interactive request if a process is waiting for responses. t) ((twittering-timeline-spec-primary-p spec) (let* ((args `(,@api-arguments (timeline-spec . ,spec) (timeline-spec-string . ,spec-string) (format . ,(when (require 'json nil t) 'json)) (clean-up-sentinel . ,(lambda (proc status connection-info) (when (memq status '(exit signal closed failed)) (twittering-release-process proc)))))) (additional-info `(,@additional-info (noninteractive . ,noninteractive) (timeline-spec . ,spec) (timeline-spec-string . ,spec-string))) (proc (twittering-call-api 'retrieve-timeline args additional-info))) (when proc (twittering-register-process proc spec spec-string) (twittering-initialize-retrieval-count spec)))) ((twittering-timeline-spec-composite-p spec) (mapc (lambda (spec) (let* ((buffer (twittering-get-buffer-from-spec spec)) (spec-string (if buffer (twittering-get-timeline-spec-string-for-buffer buffer) (twittering-timeline-spec-to-string spec)))) (twittering-retrieve-timeline spec-string noninteractive api-arguments additional-info))) (twittering-get-base-timeline-specs spec))) (t (let ((type (car spec))) (error "%s has not been supported yet" type)))))) (defun twittering-get-and-render-timeline (&optional noninteractive id spec spec-string) (let* ((spec (or spec (twittering-current-timeline-spec))) (spec-string (or spec-string (twittering-current-timeline-spec-string))) (latest-status ;; Assume that a list which was returned by ;; `twittering-current-timeline-data' is sorted. (car (twittering-current-timeline-data spec))) (since_id (cdr-safe (assq 'id latest-status))) (args `(,@(cond (id `((max_id . ,id))) (since_id `((since_id . ,since_id))) (t nil))))) (twittering-retrieve-timeline spec-string noninteractive args nil))) ;;;; ;;;; Map function for statuses on buffer ;;;; (defun twittering-for-each-property-region (prop func &optional buffer interrupt) "Apply FUNC to each region, where property PROP is non-nil, on BUFFER. If INTERRUPT is non-nil, the iteration is stopped if FUNC returns nil." (with-current-buffer (or buffer (current-buffer)) (let ((beg (point-min)) (end-marker (make-marker))) (set-marker-insertion-type end-marker t) (while (let ((value (get-text-property beg prop))) (if value (let* ((end (next-single-property-change beg prop)) (end (or end (point-max))) (end-marker (set-marker end-marker end)) (func-result (funcall func beg end value)) (end (marker-position end-marker))) (when (or (null interrupt) func-result) (if (get-text-property end prop) (setq beg end) (setq beg (next-single-property-change end prop))))) (setq beg (next-single-property-change beg prop))))) (set-marker end-marker nil)))) ;;;; ;;;; Automatic redisplay of statuses on buffer ;;;; (defun twittering-redisplay-status-on-buffer () (mapc (lambda (buffer) (unless (with-current-buffer buffer (or (and (fboundp 'use-region-p) (use-region-p)) (and transient-mark-mode mark-active))) (twittering-redisplay-status-on-each-buffer buffer))) (twittering-get-buffer-list))) (defun twittering-redisplay-status-on-each-buffer (buffer &optional prop) "Redisplay regions with the text property PROP on BUFFER." (let ((prop (or prop 'need-to-be-updated)) (deactivate-mark deactivate-mark) (window-list (get-buffer-window-list buffer nil t)) (marker (with-current-buffer buffer (point-marker))) (result nil)) (with-current-buffer buffer (save-excursion (twittering-for-each-property-region prop (lambda (beg end value) (let* ((func (car value)) (args (cdr value)) (current-str (buffer-substring beg end)) (updated-str (apply func beg end args)) (config (twittering-current-window-config window-list)) (buffer-read-only nil)) ;; Replace `current-str' if it differs to `updated-str' with ;; ignoring properties. This is an ad-hoc solution. ;; `current-str' is a part of the displayed status, but it has ;; properties which are determined by the whole status. ;; (For example, the `id' property.) ;; Therefore, we cannot compare the strings with their ;; properties. (unless (string= current-str updated-str) ;; If the region to be modified includes the current position, ;; the point moves to the beginning of the region. (when (and (< beg marker) (< marker end)) ;; This is required because the point moves to the center if ;; the point becomes outside of the window by the effect of ;; `set-window-start'. (setq result beg)) (let ((common-properties (twittering-get-common-properties beg))) ;; Restore common properties. (delete-region beg end) (goto-char beg) (insert (apply 'propertize updated-str common-properties))) (twittering-restore-window-config-after-modification config beg end)))) buffer)) (set-marker marker nil) (when (and result (eq (window-buffer) buffer)) (let ((win (selected-window))) (when (< result (window-start win)) (set-window-start win result)) (set-window-point win result)))))) ;;;; ;;;; Display replied statuses ;;;; (defun twittering-replied-statuses-visible-p (&optional pos) "Return non-nil if a replied status related to POS is visible. Return non-nil if a replied status has been rendered at POS by `twittering-show-replied-statuses'. Return non-nil if a reply is rendered at POS and the replied statuses has been rendered by `twittering-show-replied-statuses'. Otherwise, return nil." (let* ((pos (twittering-get-current-status-head pos)) (id (twittering-get-id-at pos)) (prev (twittering-get-previous-status-head pos)) (next (twittering-get-next-status-head pos))) (when id ;; If ID is nil, it means that no normal tweets are rendered at POS. (or (twittering-get-base-id-of-ancestor-at pos) (and prev (twittering-status-id= id (twittering-get-base-id-of-ancestor-at prev))) (and next (twittering-status-id= id (twittering-get-base-id-of-ancestor-at next))))))) (defun twittering-get-beginning-of-visible-replied-statuses (&optional pos) "Return the beginning position of visible replied statuses at POS. If POS is nil, the current position is used instead. If `twittering-show-replied-statuses' has rendered a replied status at POS, return the beginning position of the replied statuses with the common base status. If a reply is rendered at POS and its ancestors has been rendered by `twittering-show-replied-statuses', return the beginning position of the replied statuses. Otherwise, return nil." (let* ((pos (or pos (point))) (base-id (twittering-get-base-id-of-ancestor-at pos))) (cond (base-id ;; A replied status is rendered at POS. (while (let* ((prev (twittering-get-previous-status-head pos)) (prev-base-id (when prev (twittering-get-base-id-of-ancestor-at prev)))) (and prev prev-base-id (twittering-status-id= base-id prev-base-id) (setq pos prev)))) (or pos (point-min))) ((twittering-replied-statuses-visible-p pos) ;; A reply is rendered at POS and its replied statuses are visible. (if twittering-reverse-mode (twittering-get-beginning-of-visible-replied-statuses (twittering-get-previous-status-head pos)) (twittering-get-next-status-head pos))) (t nil)))) (defun twittering-get-end-of-visible-replied-statuses (&optional pos) "Return the end position of visible replied statuses at POS. If POS is nil, the current position is used instead. If `twittering-show-replied-statuses' has rendered a replied status at POS, return the end position of the replied statuses with the common base status. If a reply is rendered at POS and its ancestors has been rendered by `twittering-show-replied-statuses', return the beginning position of the replied statuses. Otherwise, return nil." (let* ((pos (or pos (point))) (base-id (twittering-get-base-id-of-ancestor-at pos))) (cond (base-id ;; A replied status is rendered at POS. (while (let ((current-base-id (twittering-get-base-id-of-ancestor-at pos))) (and current-base-id (twittering-status-id= base-id current-base-id) (setq pos (twittering-get-next-status-head pos))))) (or pos (point-max))) ((twittering-replied-statuses-visible-p pos) ;; A reply is rendered at POS and its replied statuses are visible. (if twittering-reverse-mode (twittering-get-current-status-head pos) (twittering-get-end-of-visible-replied-statuses (twittering-get-next-status-head pos)))) (t nil)))) (defun twittering-render-replied-statuses (&optional pos count) "Render replied statuses on the position specified by POS. If POS is nil, the current position is used instead. If COUNT is a positive integer, it specifies the number of rendered statuses. If COUNT is nil, all ancestor statuses that have been already retrieved are rendered. Return non-nil if one or more statuses are rendered. Return nil if no statuses are rendered." (let* ((pos (or pos (point))) (id ;; nil if no normal statuses are rendered at POS. (twittering-get-id-at pos)) (replied-status-are-visible (when id (twittering-replied-statuses-visible-p pos))) (base-id (if replied-status-are-visible (or ;; If a replied status is rendered at POS. (twittering-get-base-id-of-ancestor-at pos) ;; If the base reply is rendered at POS. id) id)) (statuses (when base-id (twittering-get-replied-statuses base-id (if (numberp count) count)))) (statuses (if twittering-reverse-mode statuses (reverse statuses)))) (cond ((null id) ;; No normal statuses are rendered here. nil) (statuses (let ((pos (cond ((twittering-replied-statuses-visible-p pos) ;; Some replied statuses have been already rendered. (twittering-get-beginning-of-visible-replied-statuses pos)) (twittering-reverse-mode (twittering-get-current-status-head pos)) (t (or (twittering-get-next-status-head pos) (point-max))))) (prefix " ") (buffer-read-only nil)) (save-excursion (goto-char pos) (mapc (lambda (status) (twittering-render-a-field (point) (twittering-make-field-id status base-id) (let ((formatted-status (twittering-format-status status prefix)) (field-properties (twittering-make-properties-of-popped-ancestors base-id))) (add-text-properties 0 (length formatted-status) field-properties formatted-status) formatted-status))) statuses) t))) (t nil)))) (defun twittering-render-a-status-with-delay (beg end id prefix) "Render a status with a delay. It is assumed that this function is used as a property value that is processed by the function `twittering-redisplay-status-on-each-buffer'." (let ((status (twittering-find-status id))) (when status (let ((properties (and beg (text-properties-at beg)))) (apply 'propertize (twittering-format-status status prefix) properties))))) (defun twittering-toggle-or-retrieve-replied-statuses () "Show/Hide all of replied statuses or retrieve a replied status. If the cursor points to a reply or one of expanded replied statuses and some of ancestor replied statuses have been already retrieved but they have not been rendered, render them. If the cursor points to a reply or one of expanded replied statuses and all of retrieved ancestor statuses have been already rendered but the oldest one of them is also a reply, retrieve the replied status. If the cursor points to a reply or one of expanded replied statuses and all of ancestor replied statuses have been already rendered, hide them by `twittering-hide-replied-statuses'." (interactive) (let* ((pos (point)) (pos ;; POS points to the head of the direct reply of the status being ;; retrieved. (cond ((twittering-replied-statuses-visible-p pos) ;; If some replied statuses are visible, find the edge. (if twittering-reverse-mode (twittering-get-beginning-of-visible-replied-statuses pos) (twittering-get-previous-status-head (twittering-get-end-of-visible-replied-statuses pos)))) (t (twittering-get-current-status-head pos)))) (id (twittering-get-id-at pos)) (status (twittering-find-status id)) (reply-id (cdr (assq 'in-reply-to-status-id status))) (reply-username (cdr (assq 'in-reply-to-screen-name status))) (base-id (or (twittering-get-base-id-of-ancestor-at pos) id))) (cond ((twittering-find-status reply-id) ;; The status corresponding to REPLY-ID has been already retrieved ;; but it has not been rendered. ;; ;; `twittering-render-replied-statuses' additionally renders all ;; of already retrieved statuses. (twittering-render-replied-statuses)) (reply-id (let* ((pos ;; POS points to the position where the new field will be ;; inserted. (if twittering-reverse-mode pos (or (twittering-get-next-status-head pos) (point-max)))) (field-id (twittering-make-field-id-from-id reply-id base-id)) (prefix " ") (label "[RETRIEVING...]") (symbol-for-redisplay 'waiting-for-retrieval) (properties `(,@(twittering-make-properties-of-popped-ancestors base-id) ,symbol-for-redisplay (twittering-render-a-status-with-delay ,reply-id ,prefix))) (str (apply 'propertize (concat prefix label) properties)) (buffer-read-only nil)) (twittering-call-api 'retrieve-single-tweet `((id . ,reply-id) (username . ,reply-username) (format . ,(when (require 'json nil t) 'json)) (sentinel . twittering-retrieve-single-tweet-sentinel)) `((buffer . ,(current-buffer)) (property-to-be-redisplayed . ,symbol-for-redisplay))) (save-excursion (goto-char pos) (twittering-render-a-field (point) field-id str)) (goto-char pos))) ((twittering-replied-statuses-visible-p) ;; All ancestor replied statuses have been rendered. (twittering-hide-replied-statuses)) (t ;; The pointed status is not a reply. (message "This status is not a reply."))))) (defun twittering-show-replied-statuses (&optional count interactive) (interactive) (cond ((twittering-replied-statuses-visible-p) (when interactive (message "The replied statuses were already showed."))) ((twittering-render-replied-statuses (point) count) t) (t ;; Failed to render replied statuses. (when interactive (let ((base-id (twittering-get-id-at))) (if (twittering-have-replied-statuses-p base-id) (message "The status this replies to has not been fetched yet.") (message "This status is not a reply."))))))) (defun twittering-hide-replied-statuses (&optional interactive) (interactive) (cond ((twittering-replied-statuses-visible-p) (let* ((pos (twittering-get-current-status-head (point))) (base-id (or (twittering-get-base-id-of-ancestor-at pos) (twittering-get-id-at pos))) (pointing-to-base-status (not (twittering-rendered-as-ancestor-status-p pos))) (beg (twittering-get-beginning-of-visible-replied-statuses pos)) (end (twittering-get-end-of-visible-replied-statuses pos)) (buffer-read-only nil)) (unless pointing-to-base-status (goto-char (if twittering-reverse-mode beg (or (twittering-get-previous-status-head beg) (point-min))))) (delete-region beg end))) (interactive (message "The status this replies to was already hidden.")))) (defun twittering-toggle-show-replied-statuses () (interactive) (if (twittering-replied-statuses-visible-p) (twittering-hide-replied-statuses (interactive-p)) (twittering-show-replied-statuses twittering-show-replied-tweets (interactive-p)))) ;;;; ;;;; Unread statuses info ;;;; (defvar twittering-unread-status-info nil "A list of (buffer unread-statuses-counter), where `unread-statuses-counter' means the number of statuses retrieved after the last visiting of the buffer.") (defun twittering-reset-unread-status-info-if-necessary () (when (twittering-buffer-p) (twittering-set-number-of-unread (current-buffer) 0))) (defun twittering-set-number-of-unread (buffer number) (let* ((entry (assq buffer twittering-unread-status-info)) (current (or (cadr entry) 0))) (unless (= number current) (setq twittering-unread-status-info (cons `(,buffer ,number) (if entry (remq entry twittering-unread-status-info) twittering-unread-status-info)))))) (defun twittering-make-unread-status-notifier-string () "Generate a string that displays unread statuses." (setq twittering-unread-status-info (remove nil (mapcar (lambda (entry) (when (buffer-live-p (car entry)) entry)) twittering-unread-status-info))) (let ((sum (apply '+ (mapcar 'cadr twittering-unread-status-info)))) (if (= 0 sum) "" (format "tw(%d)" sum)))) (defun twittering-update-unread-status-info () "Update `twittering-unread-status-info' with new tweets." (let* ((buffer (twittering-get-buffer-from-spec twittering-rendered-new-tweets-spec)) (current (or (cadr (assq buffer twittering-unread-status-info)) 0)) (result (+ current (length twittering-rendered-new-tweets)))) (when buffer (twittering-set-number-of-unread buffer result)))) (defun twittering-enable-unread-status-notifier () "Enable a notifier of unread statuses on `twittering-mode'." (interactive) (setq twittering-unread-status-info (mapcar (lambda (buffer) `(,buffer ,0)) (twittering-get-buffer-list))) (add-hook 'twittering-new-tweets-rendered-hook 'twittering-update-unread-status-info) (add-hook 'post-command-hook 'twittering-reset-unread-status-info-if-necessary) (add-to-list 'global-mode-string '(:eval (twittering-make-unread-status-notifier-string)) t)) (defun twittering-disable-unread-status-notifier () "Disable a notifier of unread statuses on `twittering-mode'." (interactive) (setq twittering-unread-status-info nil) (remove-hook 'twittering-new-tweets-hook 'twittering-update-unread-status-info) (remove-hook 'post-command-hook 'twittering-reset-unread-status-info-if-necessary) (setq global-mode-string (remove '(:eval (twittering-make-unread-status-notifier-string)) global-mode-string))) ;;;; ;;;; Timer ;;;; (defvar twittering-idle-timer-for-redisplay nil) (defun twittering-timer-action (func) (let ((buf (twittering-get-active-buffer-list))) (if (null buf) (twittering-stop) (funcall func) ))) (defun twittering-run-on-idle (idle-interval func &rest args) "Run FUNC the next time Emacs is idle for IDLE-INTERVAL. Even if Emacs has been idle longer than IDLE-INTERVAL, run FUNC immediately. Since immediate invocation requires `current-idle-time', it is available on Emacs 22 and later. FUNC is called as (apply FUNC ARGS)." (let ((sufficiently-idling (and (fboundp 'current-idle-time) (current-idle-time) (time-less-p (seconds-to-time idle-interval) (current-idle-time))))) (if (not sufficiently-idling) (apply 'run-with-idle-timer idle-interval nil func args) (apply func args) nil))) (defun twittering-run-repeatedly-on-idle (check-interval var idle-interval func &rest args) "Run FUNC every time Emacs is idle for IDLE-INTERVAL. Even if Emacs remains idle longer than IDLE-INTERVAL, run FUNC every CHECK-INTERVAL seconds. Since this behavior requires `current-idle-time', invocation on long idle time is available on Emacs 22 and later. VAR is a symbol of a variable to which the idle-timer is bound. FUNC is called as (apply FUNC ARGS)." (apply 'run-at-time "0 sec" check-interval (lambda (var idle-interval func &rest args) (let ((registerd (symbol-value var)) (sufficiently-idling (and (fboundp 'current-idle-time) (current-idle-time) (time-less-p (seconds-to-time idle-interval) (current-idle-time))))) (when (or (not registerd) sufficiently-idling) (when (and registerd sufficiently-idling) (cancel-timer (symbol-value var)) (apply func args)) (set var (apply 'run-with-idle-timer idle-interval nil (lambda (var func &rest args) (set var nil) (apply func args)) var func args))))) var idle-interval func args)) (defun twittering-start (&optional action) (interactive) (unless twittering-timer (let ((action (or action #'twittering-update-active-buffers))) ;; Update all active timelines forcibly. (twittering-update-active-buffers t) (setq twittering-timer (run-at-time (format "%d sec" twittering-timer-interval) twittering-timer-interval #'twittering-timer-action action)))) (unless twittering-timer-for-redisplaying (setq twittering-timer-for-redisplaying (twittering-run-repeatedly-on-idle (* 2 twittering-timer-interval-for-redisplaying) 'twittering-idle-timer-for-redisplay twittering-timer-interval-for-redisplaying #'twittering-redisplay-status-on-buffer)))) (defun twittering-stop () (interactive) (when twittering-timer (cancel-timer twittering-timer) (setq twittering-timer nil)) (when twittering-timer-for-redisplaying (when twittering-idle-timer-for-redisplay (cancel-timer twittering-idle-timer-for-redisplay) (setq twittering-idle-timer-for-redisplay)) (cancel-timer twittering-timer-for-redisplaying) (setq twittering-timer-for-redisplaying nil))) (defun twittering-get-relative-interval (spec) (let* ((spec-string (twittering-timeline-spec-to-string spec)) (normalized-alist (apply 'append (mapcar (lambda (entry) (let ((interval (car (last entry))) (regexp-list (butlast entry 1))) (when (integerp interval) (mapcar (lambda (regexp) `(,regexp . ,interval)) regexp-list)))) twittering-relative-retrieval-interval-alist))) (rest normalized-alist) (current normalized-alist) (result 0)) (while (not (or (and (stringp (car current)) (string-match (car current) spec-string)) (eq t (car current)))) (setq current (car rest)) (setq rest (cdr rest))) (if (integerp (cdr current)) (cdr current) ;; The default relative interval is 1. 1))) (defun twittering-get-retrieval-count (spec) (cdr (assoc spec twittering-relative-retrieval-count-alist))) (defun twittering-set-retrieval-count (spec count) (let ((current (assoc spec twittering-relative-retrieval-count-alist))) (if (null current) (add-to-list 'twittering-relative-retrieval-count-alist `(,spec . ,count)) (setcdr current count)))) (defun twittering-initialize-retrieval-count (spec) (twittering-set-retrieval-count spec (twittering-get-relative-interval spec))) (defun twittering-update-active-buffers (&optional force noninteractive) "Update active buffers managed by `twittering-mode' at a certain interval. If FORCE is nil, each active buffer is updated at a relative interval determined by `twittering-relative-retrieval-interval-alist'. If a relative interval of a timeline is 3, the timeline is updated once by three invocations of this function. If FORCE is non-nil, all active buffers are updated forcibly." (when (twittering-account-authorized-p) (twittering-update-service-configuration) (let* ((buffer-list (twittering-get-active-buffer-list)) (primary-spec-list (twittering-remove-duplicates (apply 'append (mapcar (lambda (buffer) (twittering-get-primary-base-timeline-specs (twittering-get-timeline-spec-for-buffer buffer))) buffer-list))))) (mapc (lambda (spec) (let ((current (if force 1 (twittering-get-retrieval-count spec)))) (cond ((null current) ;; Initialize the count if no entry for the primary timeline ;; exists. (twittering-initialize-retrieval-count spec)) ((and (integerp current) (= 0 current)) ;; Do nothing. ) ((and (integerp current) (= 1 current)) ;; Retrieve the timeline and initialize count. (let ((spec-string (twittering-timeline-spec-to-string spec))) (twittering-get-and-render-timeline noninteractive nil spec spec-string) (twittering-initialize-retrieval-count spec))) ((and (integerp current) (< 1 current)) ;; Decrement count. (twittering-set-retrieval-count spec (1- current))) (t nil)))) primary-spec-list)))) ;;;; ;;;; Keymap ;;;; (if twittering-mode-map (let ((km twittering-mode-map)) (define-key km (kbd "C-c C-f") 'twittering-friends-timeline) (define-key km (kbd "C-c C-r") 'twittering-replies-timeline) (define-key km (kbd "C-c C-n") 'twittering-mentions-timeline) (define-key km (kbd "C-c C-u") 'twittering-user-timeline) (define-key km (kbd "C-c C-d") 'twittering-direct-messages-timeline) (define-key km (kbd "C-c C-s") 'twittering-update-status-interactive) (define-key km (kbd "C-c C-e") 'twittering-erase-old-statuses) (define-key km (kbd "C-c C-m") 'twittering-retweet) (define-key km (kbd "C-c C-t") 'twittering-set-current-hashtag) (define-key km (kbd "C-m") 'twittering-enter) (define-key km (kbd "C-c C-l") 'twittering-update-lambda) (define-key km (kbd "") 'twittering-click) (define-key km (kbd "C-") 'mouse-set-point) (define-key km (kbd "C-") 'twittering-push-tweet-onto-kill-ring) (define-key km (kbd "C-c C-v") 'twittering-view-user-page) (define-key km (kbd "C-c D") 'twittering-delete-status) (define-key km (kbd "C-c C-w") 'twittering-delete-status) (define-key km (kbd "a") 'twittering-toggle-activate-buffer) (define-key km (kbd "g") 'twittering-current-timeline) (define-key km (kbd "u") 'twittering-update-status-interactive) (define-key km (kbd "U") 'twittering-push-uri-onto-kill-ring) (define-key km (kbd "d") 'twittering-direct-message) (define-key km (kbd "v") 'twittering-other-user-timeline) (define-key km (kbd "V") 'twittering-visit-timeline) (define-key km (kbd "L") 'twittering-other-user-list-interactive) (define-key km (kbd "f") 'twittering-switch-to-next-timeline) (define-key km (kbd "b") 'twittering-switch-to-previous-timeline) ;; (define-key km (kbd "j") 'next-line) ;; (define-key km (kbd "k") 'previous-line) (define-key km (kbd "j") 'twittering-goto-next-status) (define-key km (kbd "k") 'twittering-goto-previous-status) (define-key km (kbd "l") 'forward-char) (define-key km (kbd "h") 'backward-char) (define-key km (kbd "0") 'beginning-of-line) (define-key km (kbd "^") 'beginning-of-line-text) (define-key km (kbd "$") 'end-of-line) (define-key km (kbd "n") 'twittering-goto-next-status-of-user) (define-key km (kbd "p") 'twittering-goto-previous-status-of-user) (define-key km (kbd "C-i") 'twittering-goto-next-thing) (define-key km (kbd "M-C-i") 'twittering-goto-previous-thing) (define-key km (kbd "") 'twittering-goto-previous-thing) (define-key km (kbd "") 'twittering-scroll-down) (define-key km (kbd "M-v") 'twittering-scroll-down) (define-key km (kbd "SPC") 'twittering-scroll-up) (define-key km (kbd "C-v") 'twittering-scroll-up) (define-key km (kbd "G") 'twittering-goto-last-status) (define-key km (kbd "H") 'twittering-goto-first-status) (define-key km (kbd "i") 'twittering-icon-mode) (define-key km (kbd "r") 'twittering-toggle-show-replied-statuses) (define-key km (kbd "R") 'twittering-toggle-or-retrieve-replied-statuses) (define-key km (kbd "t") 'twittering-toggle-proxy) (define-key km (kbd "C-c C-p") 'twittering-toggle-proxy) (define-key km (kbd "q") 'twittering-kill-buffer) (define-key km (kbd "C-c C-q") 'twittering-search) nil)) (let ((km twittering-mode-menu-on-uri-map)) (when km (define-key km [ct] '("Copy tweet" . twittering-push-tweet-onto-kill-ring)) (define-key km [cl] '("Copy link" . twittering-push-uri-onto-kill-ring)) (define-key km [ll] '("Load link" . twittering-click)) (let ((km-on-uri twittering-mode-on-uri-map)) (when km-on-uri (define-key km-on-uri (kbd "C-") 'mouse-set-point) (define-key km-on-uri (kbd "C-") km))))) (defun twittering-keybind-message () (let ((important-commands '(("Timeline" . twittering-friends-timeline) ("Replies" . twittering-replies-timeline) ("Mentions" . twittering-mentions-timeline) ("Update status" . twittering-update-status-interactive) ("Next" . twittering-goto-next-status) ("Prev" . twittering-goto-previous-status)))) (mapconcat (lambda (command-spec) (let ((descr (car command-spec)) (command (cdr command-spec))) (format "%s: %s" descr (key-description (where-is-internal command overriding-local-map t))))) important-commands ", "))) ;; (run-with-idle-timer ;; 0.1 t ;; '(lambda () ;; (when (equal (buffer-name (current-buffer)) twittering-buffer) ;; (message (twittering-keybind-message))))) ;;;; ;;;; Initialization ;;;; (defvar twittering-initialized nil) (defvar twittering-mode-syntax-table nil "") (unless twittering-mode-syntax-table (setq twittering-mode-syntax-table (make-syntax-table)) ;; (modify-syntax-entry ? "" twittering-mode-syntax-table) (modify-syntax-entry ?\" "w" twittering-mode-syntax-table) ) (defun twittering-initialize-global-variables-if-necessary () "Initialize global variables for `twittering-mode' if they have not been initialized yet." (unless twittering-initialized (defface twittering-username-face `((t ,(append '(:underline t) (face-attr-construct (if (facep 'font-lock-string-face) 'font-lock-string-face 'bold))))) "" :group 'faces) (defface twittering-uri-face `((t (:underline t))) "" :group 'faces) (defface twittering-timeline-header-face `((t ,(face-attr-construct (if (facep 'font-lock-preprocessor-face) 'font-lock-preprocessor-face 'bold)))) "Timeline header on twittering-mode" :group 'faces) (defface twittering-timeline-footer-face `((t ,(face-attr-construct (if (facep 'font-lock-preprocessor-face) 'font-lock-preprocessor-face 'bold)))) "Timeline footer on twittering-mode" :group 'faces) (twittering-update-status-format) (when twittering-use-convert (if (null twittering-convert-program) (setq twittering-use-convert nil) (with-temp-buffer (let ((coding-system-for-read 'iso-safe) (coding-system-for-write 'iso-safe) ;; Bind `default-directory' to the temporary directory ;; because it is possible that the directory pointed by ;; `default-directory' has been already removed. (default-directory temporary-file-directory)) (call-process twittering-convert-program nil (current-buffer) nil "-version") (goto-char (point-min)) (if (null (search-forward-regexp "\\(Image\\|Graphics\\)Magick" nil t)) (setq twittering-use-convert nil)))))) (twittering-setup-proxy) (when twittering-use-icon-storage (cond ((require 'jka-compr nil t) (twittering-load-icon-properties) (add-hook 'kill-emacs-hook 'twittering-save-icon-properties)) (t (setq twittering-use-icon-storage nil) (error "Disabled icon-storage because it failed to load jka-compr.")))) (cond ((and (boundp 'twittering-sign-simple-string) twittering-sign-simple-string (or (not (boundp 'twittering-sign-string-function)) (null twittering-sign-string-function)) (eq twittering-edit-skeleton 'none) (or (null twittering-edit-skeleton-footer) (string= twittering-edit-skeleton-footer ""))) ;; Configure `twittering-edit-skeleton' as an alternative of ;; `twittering-sign-simple-string'. (twittering-edit-skeleton-change-footer (format " [%s]" twittering-sign-simple-string)) (setq twittering-edit-skeleton 'footer) (message "Warning: `twittering-sign-simple-string' is obsolete. Use `twittering-edit-skeleton-footer' instead.")) ((or (boundp 'twittering-sign-simple-string) (boundp 'twittering-sign-string-function)) (message "Warning: `twittering-sign-simple-string' and `twittering-sign-string-function' are obsolete. Use the new feature `twittering-edit-skeleton'.") )) (add-hook 'twittering-new-tweets-rendered-hook 'twittering-jojo-mode-hook-function) (run-hooks 'twittering-mode-init-hook) (setq twittering-initialized t))) (defun twittering-mode-setup (spec-string) "Set up the current buffer for `twittering-mode'." (kill-all-local-variables) (setq major-mode 'twittering-mode) (setq buffer-read-only t) (buffer-disable-undo) (setq mode-name "twittering-mode") (setq mode-line-buffer-identification `(,(default-value 'mode-line-buffer-identification) (:eval (twittering-mode-line-buffer-identification)))) ;; Prevent `global-font-lock-mode' enabling `font-lock-mode'. ;; This technique is derived from `lisp/bs.el' distributed with Emacs 22.2. (make-local-variable 'font-lock-global-modes) (setq font-lock-global-modes '(not twittering-mode)) ;; Prevent the field property attached to tweets from interfering ;; the cursor motion based on logical lines. (make-local-variable 'inhibit-field-text-motion) (setq inhibit-field-text-motion t) (make-local-variable 'twittering-timeline-spec) (make-local-variable 'twittering-timeline-spec-string) (make-local-variable 'twittering-active-mode) (make-local-variable 'twittering-icon-mode) (make-local-variable 'twittering-jojo-mode) (make-local-variable 'twittering-reverse-mode) (setq twittering-timeline-spec-string spec-string) (setq twittering-timeline-spec (twittering-string-to-timeline-spec spec-string)) (setq twittering-active-mode t) (use-local-map twittering-mode-map) (twittering-update-mode-line) (set-syntax-table twittering-mode-syntax-table) (when (and (boundp 'font-lock-mode) font-lock-mode) (font-lock-mode -1)) (add-to-list 'twittering-buffer-info-list (current-buffer) t) (run-hooks 'twittering-mode-hook)) (defun twittering-mode () "Major mode for Twitter \\{twittering-mode-map}" (interactive) (let ((timeline-spec-list (if (listp twittering-initial-timeline-spec-string) twittering-initial-timeline-spec-string (cons twittering-initial-timeline-spec-string nil)))) (twittering-visit-timeline (car timeline-spec-list)) (when (twittering-account-authorized-p) (mapc 'twittering-visit-timeline (cdr timeline-spec-list))))) ;;;; ;;;; Preparation for invoking APIs ;;;; (defun twittering-api-invocation-is-ready-p () "Return non-nil if the preparation for invoking APIs has been completed." (and ;; The global variables are initialized. twittering-initialized ;; A connection method is prepared. (let ((use-ssl (or twittering-use-ssl twittering-oauth-use-ssl))) (twittering-lookup-connection-type use-ssl)) ;; The account has been already authorized. (twittering-account-authorized-p))) (defun twittering-ensure-preparation-for-api-invocation () "Ensure prerequisites for invoking APIs. Return non-nil in success. If prerequisites has been already satisifed, just return non-nil. If prerequisites are not satisfied, this function try to satisfy them. Then, return non-nil if they has been satisfied and return nil otherwise." (twittering-initialize-global-variables-if-necessary) (and (twittering-ensure-connection-method) (twittering-ensure-private-info) (twittering-ensure-account-verification))) ;;;; ;;;; Edit mode skeleton ;;;; (defcustom twittering-edit-skeleton-footer "" "*String to be used as the footer in the edit skeleton." :group 'twittering-mode :type 'string) (defvar twittering-edit-skeleton-footer-history nil) (defcustom twittering-edit-skeleton-alist '((none . nil) (footer . ((nil _ twittering-edit-skeleton-footer))) (footer-only-normal . ((nil _ twittering-edit-skeleton-footer) . normal)) (inherit-hashtags . [(twittering-edit-skeleton-inherit-hashtags . normal) (twittering-edit-skeleton-inherit-hashtags . reply)]) (inherit-mentions . (twittering-edit-skeleton-inherit-mentions . reply)) (inherit-any . [(twittering-edit-skeleton-inherit-mentions . reply) (twittering-edit-skeleton-inherit-hashtags . normal) (twittering-edit-skeleton-inherit-hashtags . reply)])) "*Alist of skeletons performed on `twittering-update-status-interactive'. A key of the alist is a symbol and each value is nil, (SKELETON . PRED), (FUNC . PRED) or a vector of them. When invoking `twittering-update-status-interactive', the value corresponding to the key specified `twittering-edit-skeleton' are performed. The value like (SKELETON . PRED) or (FUNC . PRED) is performed when the current context matches with PRED. PRED is nil, a symbol or a function. If PRED is nil, the value is unconditionally performed. If PRED is a symbol, the value is performed only when it equals to the type of the tweet being edited. The type is one of 'direct-message, 'normal, 'organic-retweet and 'reply. If PRED is a function, the value is performed only when the predicate function PRED returns non-nil. PRED is invoked with three arguments TWEET-TYPE, IN-REPLY-TO-ID and CURRENT-SPEC. TWEET-TYPE is a symbol, which is one of 'direct-message, 'normal, 'organic-retweet and 'reply, specifying which type of tweet will be edited. If the tweet will be edited as a reply or an organic retweet, IN-REPLY-TO-ID is a string specifying the replied tweet. Otherwise, IN-REPLY-TO-ID is nil. CURRENT-SPEC specifies where the action of posting a tweet is performed. If the action is performed on a twittering-mode buffer, CURRENT-SPEC is a timeline spec string of the buffer. If the action is performed on other buffers, CURRENT-SPEC is nil. If the option IGNORE-CURRENT-SPEC for `twittering-update-status' is non-nil, CURRENT-SPEC is also nil. If PRED matches the current context, the value is performed as follows. The value like (SKELETON . PRED) is performed by directly using SKELETON as an argument of `skeleton-insert'. The value like (FUNC . PRED) is performed by invoking FUNC with three arguments, TWEET-TYPE, IN-REPLY-TO-ID and CURRENT-SPEC as same as PRED. If the value is a vector, each element is performed in order of elements in the vector. Note that the effective skeleton is invoked after inserting a recipient." :group 'twittering-mode :type 'alist) (defcustom twittering-edit-skeleton 'none "*A symbol specifying an effective skeleton. The list of valid value is defined in `twittering-edit-skeleton-alist'. To be valid, an entry should be added to `twittering-edit-skeleton-alist' first. When entering `twittering-edit-mode', the skeletons in the specified entry in `twittering-edit-skeleton-alist' are performed." :group 'twittering-mode :type (if (> (length (mapcar #'car twittering-edit-skeleton-alist)) 0) `(choice ,@(mapcar (lambda (entry) `(const ,(car entry))) twittering-edit-skeleton-alist)) 'symbol)) (defun twittering-switch-edit-skeleton () (interactive) (let ((skeleton-keys (mapcar (lambda (entry) (symbol-name (car entry))) twittering-edit-skeleton-alist)) (current (symbol-name (or twittering-edit-skeleton 'none)))) (let ((selected (twittering-completing-read (format "Skeleton (%s): " current) skeleton-keys nil t nil nil current))) (when selected (setq twittering-edit-skeleton (intern selected))))) (when (null twittering-edit-skeleton) (setq twittering-edit-skeleton 'none)) (message "Current skeleton: %s" twittering-edit-skeleton)) (defun twittering-edit-skeleton-change-footer (&optional footer-str) (interactive) (let ((footer-str (or footer-str (read-from-minibuffer "Footer: " twittering-edit-skeleton-footer nil nil 'twittering-edit-skeleton-footer-history)))) (when footer-str (setq twittering-edit-skeleton-footer footer-str))) (message "Current footer: [%s]" twittering-edit-skeleton-footer)) (defun twittering-edit-skeleton-insert-base (&optional tweet-type in-reply-to-id current-spec) (let ((entry (cdr (assq twittering-edit-skeleton twittering-edit-skeleton-alist)))) (when entry (require 'skeleton) (let ((skeletons (if (vectorp entry) entry (list entry)))) (mapcar (lambda (def) (let ((skeleton-or-func (car def)) (pred (cdr def))) (when (or (null pred) (and (functionp pred) (funcall pred tweet-type in-reply-to-id)) (and (symbolp pred) (eq pred tweet-type))) (cond ((functionp skeleton-or-func) (funcall skeleton-or-func tweet-type in-reply-to-id current-spec)) (t (skeleton-insert skeleton-or-func)))))) skeletons))))) (defun twittering-edit-skeleton-insert (&optional tweet-type in-reply-to-id current-spec) (if (> 22 emacs-major-version) ;; This prevents Emacs21 from inserting skeletons before the cursor. (let ((current (point)) (pair (with-temp-buffer (twittering-edit-skeleton-insert-base tweet-type in-reply-to-id current-spec) `(,(buffer-string) . ,(point))))) (insert (car pair)) (goto-char (+ -1 current (cdr pair)))) (twittering-edit-skeleton-insert-base tweet-type in-reply-to-id current-spec))) (defun twittering-edit-skeleton-inherit-hashtags (tweet-type in-reply-to-id current-spec) (cond (in-reply-to-id (let* ((status (twittering-find-status in-reply-to-id)) (text (cdr (assq 'text status))) (hashtags (twittering-extract-matched-substring-all (concat twittering-regexp-hash "\\([[:alpha:]0-9_-]+\\)") text)) (footer (mapconcat (lambda (tag) (concat "#" tag)) hashtags " "))) (when hashtags (skeleton-insert `(nil _ " " ,footer))))) ((twittering-timeline-spec-is-search-p current-spec) (let* ((query-string (twittering-extract-query-string-from-search-timeline-spec current-spec)) (hashtag-list (twittering-extract-matched-substring-all (concat "\\(" twittering-regexp-hash "[[:alpha:]0-9_-]+\\)") query-string))) (when hashtag-list (let ((footer (mapconcat 'identity hashtag-list " "))) (skeleton-insert `(nil _ " " ,footer)))))))) (defun twittering-edit-skeleton-inherit-mentions (tweet-type in-reply-to-id current-spec) (when in-reply-to-id (let* ((status (twittering-find-status in-reply-to-id)) (text (cdr (assq 'text status))) (recipient (cdr (assq 'user-screen-name status))) (mentions (twittering-extract-matched-substring-all (concat twittering-regexp-atmark "\\([a-zA-Z0-9_-]+\\)") text)) (reduced-mentions (remove nil (mapcar (lambda (mention) (unless (or (string= mention recipient) (string= mention (twittering-get-username))) mention)) mentions)))) (when reduced-mentions (let ((header (mapconcat (lambda (user) (concat "@" user)) reduced-mentions " "))) (skeleton-insert `(nil ,header " " _))))))) ;;;; ;;;; Edit mode ;;;; (defvar twittering-edit-buffer "*twittering-edit*") (defvar twittering-pre-edit-window-configuration nil) (defvar twittering-edit-history nil) (defvar twittering-edit-local-history nil) (defvar twittering-edit-local-history-idx nil) (defvar twittering-warning-overlay nil) (define-derived-mode twittering-edit-mode nil "twmode-status-edit" (use-local-map twittering-edit-mode-map) ;; Prevent `global-font-lock-mode' enabling `font-lock-mode'. ;; This technique is derived from `lisp/bs.el' distributed with Emacs 22.2. (make-local-variable 'font-lock-global-modes) (setq font-lock-global-modes '(not twittering-edit-mode)) (make-local-variable 'twittering-warning-overlay) (setq twittering-warning-overlay (make-overlay 1 1 nil nil nil)) (overlay-put twittering-warning-overlay 'face 'font-lock-warning-face) (make-local-variable 'twittering-edit-local-history) (setq twittering-edit-local-history (cons (buffer-string) twittering-edit-history)) (make-local-variable 'twittering-edit-local-history-idx) (setq twittering-edit-local-history-idx 0) (make-local-variable 'after-change-functions) (add-to-list 'after-change-functions 'twittering-edit-length-check) ) (when twittering-edit-mode-map (let ((km twittering-edit-mode-map)) (define-key km (kbd "C-c C-c") 'twittering-edit-post-status) (define-key km (kbd "C-c C-k") 'twittering-edit-cancel-status) (define-key km (kbd "C-c C-r") 'twittering-edit-toggle-reply) (define-key km (kbd "M-n") 'twittering-edit-next-history) (define-key km (kbd "M-p") 'twittering-edit-previous-history) (define-key km (kbd "") 'twittering-edit-replace-at-point))) (defun twittering-effective-length (str &optional short-length-http short-length-https) "Return the effective length of STR with taking account of shortening URIs. The returned length is calculated with taking account of shortening URIs if `twittering-service-method' is the symbol `twitter' or `twitter-api-v1.1'. It is assumed that a URI via HTTP will be converted into a URI consisting of SHORT-LENGTH-HTTP characters. It is assumed that a URI via HTTPS will be converted into a URI consisting of SHORT-LENGTH-HTTPS characters. If SHORT-LENGTH-HTTP is nil, the value of (twittering-get-service-configuration 'short_url_length) is used instead. If SHORT-LENGTH-HTTPS is nil, the value of (twittering-get-service-configuration 'short_url_length_https) is used instead." (cond ((memq twittering-service-method '(twitter twitter-api-v1.1)) (let ((regexp "\\(?:^\\|[[:space:]]\\)\\(http\\(s\\)?://[-_.!~*'()a-zA-Z0-9;/?:@&=+$,%#]+\\)") (short-length-http (or short-length-http (twittering-get-service-configuration 'short_url_length))) (short-length-https (or short-length-https (twittering-get-service-configuration 'short_url_length_https))) (rest str) (pos 0) (len 0)) (save-match-data (while (string-match regexp str pos) (let ((beg (match-beginning 1)) (end (match-end 1)) (short-len (if (match-beginning 2) short-length-https short-length-http))) (let ((additional-length ;; Ignore the original length to follow the change ;; of t.co URL wrapper. ;; ;; https://dev.twitter.com/docs/tco-url-wrapper ;; As of October 10, 2011 the t.co URL wrapper ;; automatically wraps all links submitted to ;; Twitter, regardless of length. This includes ;; so-called URLs without protocols. (+ (- beg pos) short-len))) (setq len (+ len additional-length)) (setq pos end))))) (+ len (- (length str) pos)))) (t (length str)))) (defun twittering-edit-length-check (&optional beg end len) (let* ((status (twittering-edit-extract-status)) (tweet-type (cdr (assq 'tweet-type twittering-edit-mode-info))) (maxlen (twittering-get-maximum-message-length tweet-type)) (length (twittering-effective-length status))) (setq mode-name (format "twmode-status-edit[%d/%d]" length maxlen)) (force-mode-line-update) (unless twittering-disable-overlay-on-too-long-string (if (< maxlen length) (move-overlay twittering-warning-overlay (- (point-max) (- length maxlen)) (point-max)) (move-overlay twittering-warning-overlay 1 1))))) (defun twittering-edit-get-help-end () "Return the end position of the help on `twittering-edit-mode'." (when (eq major-mode 'twittering-edit-mode) (next-single-property-change (point-min) 'read-only nil (point-max)))) (defun twittering-edit-extract-status () "Return the text of the status being edited on `twittering-edit-mode'." (if (eq major-mode 'twittering-edit-mode) (buffer-substring-no-properties (twittering-edit-get-help-end) (point-max)) "")) (defun twittering-edit-reset-status (str) "Reset the contents of the current `twittering-edit-mode' buffer with STR." (when (eq major-mode 'twittering-edit-mode) (let ((help-end (twittering-edit-get-help-end))) (delete-region help-end (point-max)) (goto-char help-end) (insert str) (goto-char help-end)))) (defun twittering-edit-set-help-string (str) "Render STR as a help for `twittering-edit-mode' to the current buffer." (let* ((help-str (propertize str 'read-only t)) (len (length help-str))) (add-text-properties 0 1 '(front-sticky (read-only)) help-str) (add-text-properties (1- len) len '(rear-nonsticky t) help-str) (save-excursion (let ((inhibit-read-only t) (inhibit-modification-hooks t) (help-end (twittering-edit-get-help-end))) (goto-char help-end) (if (= (point-min) help-end) ;; When no helps are rendered, the all markers should be ;; placed after the new help. (insert help-str) ;; Use `insert-before-markers' because the marker of the current ;; position should follow the new help. ;; Delete the old help after inserting the new help to make ;; the new help visible if possible. (insert-before-markers help-str) (delete-region (point-min) help-end)))))) (defun twittering-edit-setup-help () (let* ((direct-message-recipient (cdr (assq 'direct-message-recipient twittering-edit-mode-info))) (tweet-type (cdr (assq 'tweet-type twittering-edit-mode-info))) (cited-id (cdr (assq 'cited-id twittering-edit-mode-info))) (item (cond ((eq tweet-type 'direct-message) (format "a direct message to %s" direct-message-recipient)) ((eq tweet-type 'reply) "a reply") (t "a tweet"))) (status-format (cond ((eq tweet-type 'direct-message) (format "%%FILL{DIRECT MESSAGE to %s}\n" direct-message-recipient)) ((eq tweet-type 'reply) "%FILL{REPLY to the tweet by %s at %C{%y/%m/%d %H:%M:%S};}\n%FILL{%FACE[font-lock-doc-face]{\"%T\"}}\n") (t nil))) (func (when status-format (twittering-generate-format-status-function status-format))) (help-str (apply 'concat `(,@(when func `(,(funcall func (twittering-find-status cited-id) nil))) ,(propertize (format (substitute-command-keys "Keymap: \\[twittering-edit-post-status]: send %s \\[twittering-edit-cancel-status]: cancel %s \\[twittering-edit-toggle-reply]: toggle a normal tweet and a reply. \\[twittering-edit-next-history]: next history element \\[twittering-edit-previous-history]: previous history element \\[twittering-edit-replace-at-point]: shorten URL at point ---- text above this line is ignored ---- ") item item) 'face 'font-lock-comment-face))))) (twittering-edit-set-help-string help-str))) (defun twittering-edit-close () (kill-buffer (current-buffer)) (when twittering-pre-edit-window-configuration (set-window-configuration twittering-pre-edit-window-configuration) (setq twittering-pre-edit-window-configuration nil))) (defvar twittering-edit-mode-info nil "Alist of a tweet being edited. Pairs of a key symbol and an associated value are following: direct-message-recipient -- the recipient when the edited message is sent as a direct message. cited-id -- the id of the tweet that the edited message refers to. tweet-type -- the type of the edited message, which is one of the following symbol; normal, reply or direct-message.") (defun twittering-ensure-whole-of-status-is-visible (&optional window) "Ensure that the whole of the tweet on the current point is visible." (interactive) (let* ((window (or window (selected-window))) (buffer (window-buffer window))) (when (twittering-buffer-p buffer) (with-current-buffer buffer (save-excursion (let* ((next-head (or (twittering-get-next-status-head) (point-max))) (current-tail (max (1- next-head) (point-min)))) (when (< (window-end window t) current-tail) (twittering-set-window-end window current-tail)))))))) (defun twittering-update-status-from-pop-up-buffer (&optional init-string-or-skeleton reply-to-id username tweet-type current-spec) (interactive) (let ((buf (generate-new-buffer twittering-edit-buffer))) (setq twittering-pre-edit-window-configuration (current-window-configuration)) (twittering-pop-to-buffer buf) (twittering-edit-mode) (make-local-variable 'twittering-edit-mode-info) (setq twittering-edit-mode-info `((cited-id . ,reply-to-id) (tweet-type . ,(cdr (assq tweet-type '((direct-message . direct-message) (normal . normal) (organic-retweet . normal) (reply . reply))))) (direct-message-recipient . ,username))) (twittering-edit-setup-help) (twittering-edit-length-check) ;; Update mode-line (setq buffer-undo-list nil) (goto-char (twittering-edit-get-help-end)) (if (eq tweet-type 'direct-message) (message "C-c C-c to send, C-c C-k to cancel") (and (null init-string-or-skeleton) twittering-current-hashtag (setq init-string-or-skeleton (format " #%s " twittering-current-hashtag))) (message "C-c C-c to post, C-c C-k to cancel")) (when init-string-or-skeleton (require 'skeleton) (cond ((stringp init-string-or-skeleton) (insert init-string-or-skeleton)) ((listp init-string-or-skeleton) (skeleton-insert init-string-or-skeleton)))) (twittering-edit-skeleton-insert tweet-type reply-to-id current-spec) (set-buffer-modified-p nil))) (defun twittering-edit-post-status () (interactive) (let* ((status (twittering-edit-extract-status)) (cited-id (cdr (assq 'cited-id twittering-edit-mode-info))) (cited-tweet (twittering-find-status cited-id)) (cited-username (cdr (assq 'user-screen-name cited-tweet))) (direct-message-recipient (cdr (assq 'direct-message-recipient twittering-edit-mode-info))) (tweet-type (cdr (assq 'tweet-type twittering-edit-mode-info))) (max-length (twittering-get-maximum-message-length tweet-type))) (cond ((string-match "\\` *\\'" status) (message "Empty tweet!")) ((< max-length (twittering-effective-length status)) (message "Tweet is too long!")) ((cond (twittering-request-confirmation-on-posting (y-or-n-p "Send this tweet? ")) (t t)) (setq twittering-edit-history (cons status twittering-edit-history)) (cond ((eq tweet-type 'direct-message) (if direct-message-recipient (twittering-call-api 'send-direct-message `((username . ,direct-message-recipient) (status . ,status))) (message "No username specified"))) ((eq tweet-type 'reply) (twittering-call-api 'update-status `((status . ,status) (in-reply-to-status-id . ,cited-id)))) (t (twittering-call-api 'update-status `((status . ,status))))) (twittering-edit-close)) (t nil)))) (defun twittering-edit-cancel-status () (interactive) (when (or (not (buffer-modified-p)) (prog1 (if (y-or-n-p "Cancel this tweet? ") (message "Request canceled") (message nil)))) (twittering-edit-close))) (defun twittering-edit-next-history () (interactive) (if (>= 0 twittering-edit-local-history-idx) (message "End of history.") (let ((current-history (nthcdr twittering-edit-local-history-idx twittering-edit-local-history))) (setcar current-history (twittering-edit-extract-status)) (decf twittering-edit-local-history-idx) (twittering-edit-reset-status (nth twittering-edit-local-history-idx twittering-edit-local-history))))) (defun twittering-edit-previous-history () (interactive) (if (>= twittering-edit-local-history-idx (- (length twittering-edit-local-history) 1)) (message "Beginning of history.") (let ((current-history (nthcdr twittering-edit-local-history-idx twittering-edit-local-history))) (setcar current-history (twittering-edit-extract-status)) (incf twittering-edit-local-history-idx) (twittering-edit-reset-status (nth twittering-edit-local-history-idx twittering-edit-local-history))))) (defun twittering-edit-replace-at-point () (interactive) (when (eq major-mode 'twittering-edit-mode) (twittering-tinyurl-replace-at-point) (twittering-edit-length-check))) (defun twittering-edit-toggle-reply () "Toggle whether the tweet being edited will be sent as a reply or not." (interactive) (let ((tweet-type (cdr (assq 'tweet-type twittering-edit-mode-info))) (cited-id (cdr (assq 'cited-id twittering-edit-mode-info)))) (cond ((eq tweet-type 'direct-message) (message "The current message is a direct message.")) ((null cited-id) (message "The current message does not have a reply target.")) (t (setq twittering-edit-mode-info (mapcar (lambda (entry) (if (eq (car entry) 'tweet-type) `(tweet-type . ,(cdr (assq (cdr entry) '((normal . reply) (reply . normal))))) entry)) twittering-edit-mode-info)) (twittering-edit-setup-help))))) ;;;; ;;;; Edit a status on minibuffer ;;;; (defun twittering-show-minibuffer-length (&optional beg end len) "Show the number of characters in minibuffer." (when (minibuffer-window-active-p (selected-window)) (if (and transient-mark-mode deactivate-mark) (deactivate-mark)) (let* ((deactivate-mark deactivate-mark) (status-len (- (twittering-effective-length (buffer-string)) (minibuffer-prompt-width))) (mes (format "%d" status-len))) (if (<= 23 emacs-major-version) (minibuffer-message mes) ;; Emacs23 or later (minibuffer-message (concat " (" mes ")"))) ))) (defun twittering-setup-minibuffer () (add-hook 'post-command-hook 'twittering-show-minibuffer-length t t)) (defun twittering-finish-minibuffer () (remove-hook 'post-command-hook 'twittering-show-minibuffer-length t)) (defun twittering-status-not-blank-p (status) (let ((coding-system-for-read 'binary) (coding-system-for-write 'binary)) (with-temp-buffer (insert status) (goto-char (point-min)) ;; skip user name (re-search-forward "\\`[[:space:]]*@[a-zA-Z0-9_-]+\\([[:space:]]+@[a-zA-Z0-9_-]+\\)*" nil t) (re-search-forward "[^[:space:]]" nil t)))) (defun twittering-update-status-from-minibuffer (&optional init-string-or-skeleton reply-to-id username tweet-type current-spec) (and (not (eq tweet-type 'direct-message)) (null init-string-or-skeleton) twittering-current-hashtag (setq init-string-or-skeleton (format " #%s " twittering-current-hashtag))) (let ((status (with-temp-buffer (when init-string-or-skeleton (require 'skeleton) (cond ((stringp init-string-or-skeleton) (insert init-string-or-skeleton)) ((listp init-string-or-skeleton) (skeleton-insert init-string-or-skeleton)))) (twittering-edit-skeleton-insert tweet-type reply-to-id current-spec) `(,(buffer-string) . ,(point)))) (not-posted-p t) (prompt "status: ") (map minibuffer-local-map) (minibuffer-message-timeout nil)) (define-key map (kbd "") 'twittering-tinyurl-replace-at-point) (when twittering-use-show-minibuffer-length (add-hook 'minibuffer-setup-hook 'twittering-setup-minibuffer t) (add-hook 'minibuffer-exit-hook 'twittering-finish-minibuffer t)) (unwind-protect (while not-posted-p (setq status (read-from-minibuffer prompt status map nil 'twittering-tweet-history nil t)) (let ((status status) (max-length (twittering-get-maximum-message-length tweet-type))) (if (< max-length (twittering-effective-length status)) (setq prompt "status (too long): ") (setq prompt "status: ") (when (twittering-status-not-blank-p status) (cond ((eq tweet-type 'direct-message) (if username (twittering-call-api 'send-direct-message `((username . ,username) (status . ,status))) (message "No username specified"))) (t (let ((parameters `(("status" . ,status))) (as-reply (and reply-to-id username (eq tweet-type 'reply) (string-match (concat "@" username "\\(?:[\n\r \t]+\\)*") status)))) ;; Add in_reply_to_status_id only when a posting ;; status begins with @username. (twittering-call-api 'update-status `((status . ,status) ,@(when as-reply `((in-reply-to-status-id . ,(format "%s" reply-to-id)))))) ))) (setq not-posted-p nil)) ))) ;; unwindforms (when (memq 'twittering-setup-minibuffer minibuffer-setup-hook) (remove-hook 'minibuffer-setup-hook 'twittering-setup-minibuffer)) (when (memq 'twittering-finish-minibuffer minibuffer-exit-hook) (remove-hook 'minibuffer-exit-hook 'twittering-finish-minibuffer)) ))) ;;;; ;;;; Reading username/listname with completion ;;;; (defun twittering-get-usernames-from-timeline (&optional timeline-data) (let ((timeline-data (or timeline-data (twittering-current-timeline-data)))) (twittering-remove-duplicates (mapcar (lambda (status) (let* ((base-str (cdr (assq 'user-screen-name status))) ;; `copied-str' is independent of the string in timeline-data. ;; This isolation is required for `minibuf-isearch.el', ;; which removes the text properties of strings in history. (copied-str (copy-sequence base-str))) (set-text-properties 0 (length copied-str) nil copied-str) copied-str)) timeline-data)))) (defun twittering-read-username-with-completion (prompt init-user &optional history) (let ((collection (append twittering-user-history (twittering-get-usernames-from-timeline)))) (twittering-completing-read prompt collection nil nil init-user history))) (defun twittering-read-list-name (username &optional list-index) (let* ((list-index (or list-index (twittering-get-list-index-sync username))) (username (prog1 (copy-sequence username) (set-text-properties 0 (length username) nil username))) (prompt (format "%s's list: " username)) (listname (if list-index (twittering-completing-read prompt list-index nil t nil) nil))) (if (string= "" listname) nil listname))) (defun twittering-read-subscription-list-name (username &optional list-index) (let* ((list-index (or list-index (twittering-get-list-subscriptions-sync username))) (username (prog1 (copy-sequence username) (set-text-properties 0 (length username) nil username))) (prompt (format "%s's subscription: " username)) (listname (if list-index (twittering-completing-read prompt list-index nil t nil) nil))) (if (string= "" listname) nil listname))) (defun twittering-read-timeline-spec-with-completion (prompt initial &optional as-string) (let* ((dummy-hist (append twittering-timeline-history (twittering-get-usernames-from-timeline) '(":direct_messages" ":direct_messages_sent" ":favorites" ":friends" ":home" ":mentions" ":public" ":replies" ":retweeted_by_me" ":retweeted_by_user/" ":retweeted_to_me" ":retweeted_to_user/" ":retweets_of_me") (mapcar (lambda (cell) (concat "$" (car cell) (if (listp (cdr cell)) "()" ""))) twittering-timeline-spec-alias))) (spec-with-username '((":favorites/" . "Whose favorites: ") (":retweeted_by_user/" . "Who has retweeted? ") (":retweeted_to_user/" . "Who has received the retweets? "))) (regexp-spec-with-username (concat "\\`\\(" (mapconcat (lambda (entry) (car entry)) spec-with-username "\\|") "\\)\\'")) (spec-string (twittering-completing-read prompt dummy-hist nil nil initial 'dummy-hist)) (spec-string (cond ((string-match regexp-spec-with-username spec-string) (let* ((spec-and-prompt (assoc (match-string 1 spec-string) spec-with-username)) (prefix (car spec-and-prompt)) (prompt (cdr spec-and-prompt)) (username (twittering-read-username-with-completion prompt "" 'twittering-user-history))) (if username (concat prefix username) nil))) ((string-match "^\\([a-zA-Z0-9_-]+\\)/$" spec-string) (let* ((username (match-string 1 spec-string)) (list-index (twittering-get-list-index-sync username)) (listname (if list-index (twittering-read-list-name username list-index) nil))) (if listname (concat username "/" listname) nil))) (t spec-string))) (spec (if (stringp spec-string) (condition-case error-str (twittering-string-to-timeline-spec spec-string) (error (message "Invalid timeline spec: %s" error-str) nil)) nil))) (cond ((null spec) nil) (spec (if as-string spec-string spec)) ((string= "" spec-string) (message "No timeline specs are specified.") nil) (t (message "\"%s\" is invalid as a timeline spec." spec-string) nil)))) ;;;; ;;;; Commands ;;;; ;;;; Commands for changing modes (defun twittering-jojo-mode (&optional arg) (interactive "P") (let ((prev-mode twittering-jojo-mode)) (setq twittering-jojo-mode (if (null arg) (not twittering-jojo-mode) (< 0 (prefix-numeric-value arg)))) (unless (eq prev-mode twittering-jojo-mode) (twittering-update-mode-line)))) (defun twittering-toggle-reverse-mode (&optional arg) (interactive "P") (let ((prev-mode twittering-reverse-mode)) (setq twittering-reverse-mode (if (null arg) (not twittering-reverse-mode) (< 0 (prefix-numeric-value arg)))) (unless (eq prev-mode twittering-reverse-mode) (twittering-update-mode-line) (twittering-rerender-timeline-all (current-buffer))))) (defun twittering-set-current-hashtag (&optional tag) (interactive) (unless tag (setq tag (twittering-completing-read "hashtag (blank to clear): #" twittering-hashtag-history nil nil twittering-current-hashtag 'twittering-hashtag-history)) (message (if (eq 0 (length tag)) (progn (setq twittering-current-hashtag nil) "Current hashtag is not set.") (progn (setq twittering-current-hashtag tag) (format "Current hashtag is #%s" twittering-current-hashtag)))))) ;;;; Commands for switching buffers (defun twittering-switch-to-next-timeline () (interactive) (when (twittering-buffer-p) (let* ((buffer-list (twittering-get-buffer-list)) (following-buffers (cdr (memq (current-buffer) buffer-list))) (next (if following-buffers (car following-buffers) (car buffer-list)))) (unless (eq (current-buffer) next) (switch-to-buffer next))))) (defun twittering-switch-to-previous-timeline () (interactive) (when (twittering-buffer-p) (let* ((buffer-list (reverse (twittering-get-buffer-list))) (preceding-buffers (cdr (memq (current-buffer) buffer-list))) (previous (if preceding-buffers (car preceding-buffers) (car buffer-list)))) (unless (eq (current-buffer) previous) (switch-to-buffer previous))))) ;;;; Commands for visiting a timeline (defun twittering-visit-timeline (&optional timeline-spec initial) (interactive) (cond ((twittering-ensure-preparation-for-api-invocation) (let ((timeline-spec (or timeline-spec (twittering-read-timeline-spec-with-completion "timeline: " initial t)))) (when timeline-spec (switch-to-buffer (twittering-get-managed-buffer timeline-spec))))) (t nil))) (defun twittering-friends-timeline () (interactive) (twittering-visit-timeline '(friends))) (defun twittering-home-timeline () (interactive) (twittering-visit-timeline '(home))) (defun twittering-replies-timeline () (interactive) (twittering-visit-timeline '(replies))) (defun twittering-mentions-timeline () (interactive) (twittering-visit-timeline '(mentions))) (defun twittering-public-timeline () (interactive) (twittering-visit-timeline '(public))) (defun twittering-user-timeline () (interactive) (twittering-visit-timeline `(user ,(twittering-get-username)))) (defun twittering-direct-messages-timeline () (interactive) (twittering-visit-timeline '(direct_messages))) (defun twittering-sent-direct-messages-timeline () (interactive) (twittering-visit-timeline '(direct_messages_sent))) (defun twittering-other-user-timeline () (interactive) (let* ((username (get-text-property (point) 'username)) (goto-spec (get-text-property (point) 'goto-spec)) (screen-name-in-text (get-text-property (point) 'screen-name-in-text)) (uri (or (get-text-property (point) 'expanded-uri) (get-text-property (point) 'uri))) (mentioned-id (when uri (twittering-extract-id-from-url uri))) (spec (cond (goto-spec goto-spec) (screen-name-in-text `(user ,screen-name-in-text)) (mentioned-id `(single ,mentioned-id)) (username `(user ,username)) (t nil)))) (if spec (twittering-visit-timeline spec) (message "No user selected")))) (defun twittering-other-user-timeline-interactive () (interactive) (let ((username (or (twittering-read-username-with-completion "user: " nil 'twittering-user-history) ""))) (if (string= "" username) (message "No user selected") (twittering-visit-timeline `(user ,username))))) (defun twittering-other-user-list-interactive (&optional subscriptions) (interactive "P") (let* ((username (copy-sequence (get-text-property (point) 'username))) (username (progn (set-text-properties 0 (length username) nil username) (or (twittering-read-username-with-completion (if subscriptions "Whose subscription: " "Whose list: ") username 'twittering-user-history) "")))) (if (string= "" username) (message "No user selected") (let* ((list-name (if subscriptions (twittering-read-subscription-list-name username) (twittering-read-list-name username))) (spec (cond ((null list-name) nil) (subscriptions (and (string-match "\\`\\(.*\\)/\\(.*\\)\\'" list-name) `(list ,(match-string 1 list-name) ,(match-string 2 list-name)))) (t `(list ,username ,list-name))))) (if spec (twittering-visit-timeline spec) ;; Don't show message here to prevent an overwrite of a ;; message which is outputted by `twittering-read-list-name'. ))))) (defun twittering-search (&optional word) (interactive) (let ((word (or word (read-from-minibuffer "search: " nil nil nil 'twittering-search-history nil t) ""))) (if (string= "" word) (message "No query string") (let ((spec `(search ,word))) (twittering-visit-timeline spec))))) ;;;; Commands for retrieving statuses (defun twittering-current-timeline-noninteractive () (twittering-current-timeline t)) (defun twittering-current-timeline (&optional noninteractive) (interactive) (when (twittering-buffer-p) (let ((spec-string (twittering-current-timeline-spec-string))) (twittering-get-and-render-timeline noninteractive)))) (defun twittering-get-tweets-within-specific-time-range (time-beg time-end) "Get tweets within a time range between TIME-BEG and TIME-END. TIME-BEG and TIME-END must be nil or an internal representation of time as same as the returned value of `current-time'." (let* ((since_id (when time-beg (twittering-time-to-id time-beg))) (max_id (when time-end (twittering-time-to-id time-end))) (spec-string (twittering-current-timeline-spec-string)) (noninteractive t) (args `(,@(cond (max_id `((max_id . ,max_id))) (since_id `((since_id . ,since_id))) (t nil))))) (twittering-retrieve-timeline spec-string noninteractive args nil))) (defun twittering-get-tweets-before (&optional before-str) (interactive) (let* ((id (when (null before-str) (twittering-get-id-at))) (init-str (when id (let* ((status (twittering-find-status id)) (init-time (or (cdr (assq 'retweeting-created-at status)) (cdr (assq 'created-at status))))) (format-time-string "%Y-%m-%d %T" init-time)))) (before-str (or before-str (read-string "before [YYYY-MM-DD [HH:MM:SS]]: " init-str))) (time-beg nil) (time-end (apply 'encode-time (twittering-parse-time-string before-str t)))) (twittering-get-tweets-within-specific-time-range time-beg time-end))) ;;;; Commands for posting a status (defun twittering-update-status (&optional init-string-or-skeleton reply-to-id username tweet-type ignore-current-spec) "Post a tweet. The first argument INIT-STRING-OR-SKELETON is nil, an initial text or a skeleton to be inserted with `skeleton-insert'. REPLY-TO-ID is an ID of a tweet which you are going to cite or reply to. USERNAME is a recipient of a direct message. TWEET-TYPE is a symbol meaning the type of the tweet being edited. It must be one of 'direct-message, 'normal, 'organic-retweet and 'reply. If TWEET-TYPE is nil, it is equivalent to 'normal, which means that a tweet is edited as a normal tweet. If IGNORE-CURRENT-SPEC is non-nil, the timeline spec of the current buffer is sent to the function specified by `twittering-update-status-function'. How to edit a tweet is determined by `twittering-update-status-funcion'." (let ((current-spec (unless ignore-current-spec (twittering-current-timeline-spec))) (tweet-type (or tweet-type 'normal))) (funcall twittering-update-status-function init-string-or-skeleton reply-to-id username tweet-type current-spec))) (defun twittering-update-status-interactive () (interactive) (twittering-update-status)) (defun twittering-update-lambda () (interactive) (when (and (string= "Japanese" current-language-environment) (or (< 21 emacs-major-version) (eq 'utf-8 (terminal-coding-system)))) (let ((text (mapconcat 'char-to-string (mapcar 'twittering-ucs-to-char '(955 12363 12431 12356 12356 12424 955)) ""))) (twittering-call-api 'update-status `((status . ,text)))))) (defun twittering-post-predicted-message-like-jojo (status) (let ((screen-name (cdr (assq 'user-screen-name status))) (text (cdr (assq 'text status)))) (when (and (not (string= screen-name (twittering-get-username))) (string-match (mapconcat 'char-to-string (mapcar 'twittering-ucs-to-char '(#x6b21 #x306b #x005c #x0028 #x304a #x524d #x005c #x007c #x8cb4 #x69d8 #x005c #x0029 #x306f #x300c #x005c #x0028 #x005b #x005e #x300d #x005d #x002b #x005c #x0029 #x300d #x3068 #x8a00 #x3046)) "") text)) (let ((text (concat "@" screen-name " " (match-string-no-properties 2 text) (mapconcat 'char-to-string (mapcar 'twittering-ucs-to-char '(#x3000 #x306f #x3063 #x0021 #x003f)) "")))) (twittering-call-api 'update-status `((status . ,text))))))) (defun twittering-jojo-mode-hook-function () (when (and twittering-jojo-mode (string= "Japanese" current-language-environment) (or (< 21 emacs-major-version) (eq 'utf-8 (terminal-coding-system)))) (mapcar 'twittering-post-predicted-message-like-jojo twittering-rendered-new-tweets))) (defun twittering-direct-message () (interactive) (let ((username (twittering-read-username-with-completion "Who would you like to receive the DM? " (get-text-property (point) 'username) 'twittering-user-history))) (if (string= "" username) (message "No user selected") (twittering-update-status nil nil username 'direct-message)))) (defun twittering-reply-to-user () (interactive) (let ((username (get-text-property (point) 'username))) (if username (twittering-update-status (concat "@" username " ")) (message "No user selected")))) ;;;; Command for deleting a status (defun twittering-delete-status (&optional id) (interactive) (let* ((id (twittering-get-id-at)) (status (twittering-find-status id)) (is-retweet (assq 'retweeted-id status)) (username (if is-retweet (cdr (assq 'retweeting-user-screen-name status)) (cdr (assq 'user-screen-name status)))) (text (if is-retweet (cdr (assq 'retweeting-text status)) (cdr (assq 'text status)))) (width (max 40 ;; XXX (- (frame-width) 1 ;; margin for wide characters 11 ;; == (length (concat "Delete \"" "\"? ")) 9) ;; == (length "(y or n) ") )) (mes (format "Delete \"%s\"? " (if (< width (string-width text)) (concat (truncate-string-to-width text (- width 3)) "...") text)))) (cond ((not (string= username (twittering-get-username))) (message "The status is not yours!")) ((not id) (message "No status selected")) ((y-or-n-p mes) (twittering-call-api 'destroy-status `((id . ,id)))) (t (message "Request canceled"))))) ;;;; Commands for retweet (defun twittering-retweet (&optional arg) (interactive "P") (let ((use-native-retweet-flag (if arg (not twittering-use-native-retweet) twittering-use-native-retweet))) (if use-native-retweet-flag (twittering-native-retweet) (twittering-organic-retweet)))) (defun twittering-organic-retweet () (interactive) (let* ((id (twittering-get-id-at)) (status (twittering-find-status id)) (username (cdr (assq 'user-screen-name status))) (text (cdr (assq 'text status))) (retweet-time (current-time)) (skeleton-with-format-string (cond ((null twittering-retweet-format) '(nil _ " RT: %t (via @%s)")) ((stringp twittering-retweet-format) `(nil ,twittering-retweet-format _)) ((listp twittering-retweet-format) twittering-retweet-format) (t nil)))) (cond ((cdr (assq 'user-protected status)) (error "Cannot retweet protected tweets.")) (username (let ((prefix "%") (replace-table `(("%" . "%") ("s" . ,username) ("t" . ,text) ("#" . ,id) ("u" . ,(twittering-get-status-url-from-alist status)) ("C{\\([^}]*\\)}" . (lambda (context) (let ((str (cdr (assq 'following-string context))) (match-data (cdr (assq 'match-data context)))) (store-match-data match-data) (format-time-string (match-string 1 str) ',retweet-time)))) )) ) (twittering-update-status (mapcar (lambda (element) (if (stringp element) (twittering-format-string element prefix replace-table) element)) skeleton-with-format-string) id nil 'organic-retweet) ))))) (defun twittering-native-retweet () (interactive) (let ((id (get-text-property (point) 'id)) (text (copy-sequence (get-text-property (point) 'text))) (width (max 40 ;; XXX (- (frame-width) 1 ;; margin for wide characters 12 ;; == (length (concat "Retweet \"" "\"? ")) 9) ;; == (length "(y or n) ") ))) (set-text-properties 0 (length text) nil text) (if id (let ((mes (format "Retweet \"%s\"? " (if (< width (string-width text)) (concat (truncate-string-to-width text (- width 3)) "...") text)))) (if (y-or-n-p mes) (twittering-call-api 'retweet `((id . ,id))) (message "Request canceled"))) (message "No status selected")))) ;;;; Commands for browsing information related to a status (defun twittering-click () (interactive) (let ((uri (get-text-property (point) 'uri))) (if uri (browse-url uri)))) (defun twittering-enter () (interactive) (let* ((username (get-text-property (point) 'username)) (id (twittering-get-id-at (point))) (uri (get-text-property (point) 'uri)) (tweet-type (cond ((twittering-timeline-spec-is-direct-messages-p (get-text-property (point) 'source-spec)) 'direct-message) (t 'reply))) (screen-name-in-text (get-text-property (point) 'screen-name-in-text)) (initial-str (when (and (not (eq tweet-type 'direct-message)) (or screen-name-in-text username)) (concat "@" (or screen-name-in-text username) " "))) (field-id (get-text-property (point) 'field)) (is-latest-end (twittering-field-id-is-timeline-latest-end field-id)) (is-oldest-end (twittering-field-id-is-timeline-oldest-end field-id))) (cond (is-latest-end (message "Get more of the recent timeline...") (if twittering-reverse-mode (twittering-goto-last-normal-field) (twittering-goto-first-normal-field)) (twittering-get-and-render-timeline)) (is-oldest-end (let* ((oldest-status (car (last (twittering-current-timeline-data)))) (oldest-id (cdr (assq 'id oldest-status)))) (message "Get more of the previous timeline...") (if twittering-reverse-mode (twittering-goto-first-normal-field) (twittering-goto-last-normal-field)) (twittering-get-and-render-timeline nil oldest-id))) (screen-name-in-text (twittering-update-status initial-str id screen-name-in-text tweet-type)) (uri (browse-url uri)) (username (twittering-update-status initial-str id username tweet-type))))) (defun twittering-view-user-page () (interactive) (let ((uri (get-text-property (point) 'uri))) (if uri (browse-url uri)))) ;;;; ;;;; Commands corresponding to operations on Twitter ;;;; (defun twittering-follow (&optional remove) (interactive "P") (let* ((method (if remove 'destroy-friendships 'create-friendships)) (mes (if remove "unfollow" "follow")) (id (twittering-get-id-at)) (status (when id (twittering-find-status id))) (username (cond ((assq 'retweeted-id status) (let* ((retweeting-username (cdr (assq 'retweeting-user-screen-name status))) (retweeted-username (cdr (assq 'retweeted-user-screen-name status))) (default (if remove retweeting-username retweeted-username)) (prompt (format "Who do you %s? (default:%s): " mes default)) (candidates (list retweeted-username retweeting-username))) (twittering-completing-read prompt candidates nil t nil nil default))) (status (cdr (assq 'user-screen-name status))) (t (twittering-read-username-with-completion (format "Who do you %s? " mes) "" 'twittering-user-history))))) (if (string= "" username) (message "No user selected") (if (y-or-n-p (format "%s %s? " (capitalize mes) username)) (twittering-call-api method `((username . ,username))) (message "Request canceled"))))) (defun twittering-unfollow () (interactive) (twittering-follow t)) (defun twittering-favorite (&optional remove) (interactive "P") (let ((id (get-text-property (point) 'id)) (text (copy-sequence (get-text-property (point) 'text))) (width (max 40 ;; XXX (- (frame-width) 1 ;; margin for wide characters 15 ;; == (length (concat "Unfavorite \"" "\"? ")) 9) ;; == (length "(y or n) ") )) (method (if remove 'destroy-favorites 'create-favorites))) (set-text-properties 0 (length text) nil text) (if id (let ((mes (format "%s \"%s\"? " (if remove "Unfavorite" "Favorite") (if (< width (string-width text)) (concat (truncate-string-to-width text (- width 3)) "...") text)))) (if (y-or-n-p mes) (twittering-call-api method `((id . ,id))) (message "Request canceled"))) (message "No status selected")))) (defun twittering-unfavorite () (interactive) (twittering-favorite t)) (defun twittering-mute (&optional remove) (interactive "P") (let* ((method (if remove 'unmute 'mute)) (mes (if remove "unmute" "mute")) (id (twittering-get-id-at)) (status (when id (twittering-find-status id))) (username (cond ((assq 'retweeted-id status) (let* ((retweeting-username (cdr (assq 'retweeting-user-screen-name status))) (retweeted-username (cdr (assq 'retweeted-user-screen-name status))) (default (if remove retweeting-username retweeted-username)) (prompt (format "Who do you %s? (default:%s): " mes default)) (candidates (list retweeted-username retweeting-username))) (twittering-completing-read prompt candidates nil t nil nil default))) (status (cdr (assq 'user-screen-name status))) (t (twittering-read-username-with-completion (format "Who do you %s? " mes) "" 'twittering-user-history))))) (if (string= "" username) (message "No user selected") (if (y-or-n-p (format "%s %s? " (capitalize mes) username)) (twittering-call-api method `((username . ,username))) (message "Request canceled"))))) (defun twittering-unmute () (interactive) (twittering-mute t)) (defun twittering-block () "Block a user who posted the tweet at the current position." (interactive) (let* ((id (twittering-get-id-at)) (status (when id (twittering-find-status id))) (username (cond ((assq 'retweeted-id status) (let* ((retweeting-username (cdr (assq 'retweeting-user-screen-name status))) (retweeted-username (cdr (assq 'retweeted-user-screen-name status))) (prompt "Who do you block? ") (candidates (list retweeted-username retweeting-username))) (twittering-completing-read prompt candidates nil t))) (status (cdr (assq 'user-screen-name status))) (t nil)))) (cond ((or (null username) (string= "" username)) (message "No user selected")) ((yes-or-no-p (format "Really block \"%s\"? " username)) (twittering-call-api 'block `((username . ,username)))) (t (message "Request canceled"))))) (defun twittering-block-and-report-as-spammer () "Report a user who posted the tweet at the current position as a spammer. The user is also blocked." (interactive) (let* ((id (twittering-get-id-at)) (status (when id (twittering-find-status id))) (username (cond ((assq 'retweeted-id status) (let* ((retweeting-username (cdr (assq 'retweeting-user-screen-name status))) (retweeted-username (cdr (assq 'retweeted-user-screen-name status))) (prompt "Who do you report as a spammer? ") (candidates (list retweeted-username retweeting-username))) (twittering-completing-read prompt candidates nil t))) (status (cdr (assq 'user-screen-name status))) (t nil)))) (cond ((or (null username) (string= "" username)) (message "No user selected")) ((yes-or-no-p (format "Really block \"%s\" and report him or her as a spammer? " username)) (twittering-call-api 'block-and-report-as-spammer `((username . ,username)))) (t (message "Request canceled"))))) ;;;; Commands for clearing stored statuses. (defun twittering-erase-old-statuses () (interactive) (when (twittering-buffer-p) (let ((spec (twittering-current-timeline-spec))) (twittering-remove-timeline-data spec) ;; clear current timeline. (twittering-rerender-timeline-all (current-buffer)) ;; clear buffer. (twittering-get-and-render-timeline)))) ;;;; Cursor motion (defun twittering-get-id-at (&optional pos) "Return ID of the status at POS. If a separator is rendered at POS, return the ID of the status rendered before the separator. The default value of POS is `(point)'." (let ((pos (or pos (point)))) (or (get-text-property pos 'id) (let ((prev (or (twittering-get-current-status-head pos) (point-min)))) (and prev (get-text-property prev 'id)))))) (defun twittering-get-current-status-head (&optional pos) "Return the head position of the status at POS. If POS is nil, the value of point is used for POS. If a separator is rendered at POS, return the head of the status followed by the separator. Return POS if no statuses are rendered." (let* ((pos (or pos (point))) (field-id (get-text-property pos 'field)) ;; Find the beginning of the field regardless of stickiness. (head (field-beginning pos t))) (cond ((null field-id) ;; A separator is rendered at `pos'. (if (get-text-property head 'field) ;; When `pos' points the head of the separator, `head' points ;; to the beginning of the status followed by the separator. head ;; In the case that `pos' points to a character of the separator, ;; but not to the head of the separator. (field-beginning head t))) ((null (get-text-property head 'field)) ;; When `head' points to a separator, `pos' points to the head ;; of a status. pos) ((not (twittering-field-id= field-id (get-text-property head 'field))) ;; When `pos' points to the beginning of the field and it also ;; points to the end of the previous field, `head' points to the ;; head of the previous status. pos) (t head)))) (defun twittering-goto-first-status () "Go to the first status." (interactive) (goto-char (or (twittering-get-first-status-head) (point-min)))) (defun twittering-get-first-status-head () "Return the head position of the first status in the current buffer. Return nil if no statuses are rendered." (if (get-text-property (point-min) 'field) (point-min) (twittering-get-next-status-head (point-min)))) (defun twittering-goto-last-status () "Go to the last status." (interactive) (goto-char (or (twittering-get-last-status-head) (point-min)))) (defun twittering-get-last-status-head () "Return the head position of the last status in the current buffer. Return nil if no statuses are rendered." (if (get-text-property (point-max) 'field) (point-max) (twittering-get-previous-status-head (point-max)))) (defun twittering-goto-first-normal-field () "Go to the first normal field. A normal field is a field corresponding to a tweet." (interactive) (goto-char (or (twittering-get-first-normal-field-head) (point-min)))) (defun twittering-goto-last-normal-field () "Go to the last normal field. A normal field is a field corresponding to a tweet." (interactive) (goto-char (or (twittering-get-last-normal-field-head) (point-max)))) (defun twittering-get-first-normal-field-head () "Return the head position of the first normal field in the current buffer. A normal field is a field corresponding to a tweet. Return nil if no statuses are rendered." (let ((pos (twittering-get-first-status-head))) (while (and pos (< pos (point-max)) (null (get-text-property pos 'id))) (setq pos (twittering-get-next-status-head pos))) (when (and pos (< pos (point-max)) (get-text-property pos 'id)) pos))) (defun twittering-get-last-normal-field-head () "Return the head position of the last normal field in the current buffer. A normal field is a field corresponding to a tweet. Return nil if no statuses are rendered." (let ((pos (twittering-get-last-status-head))) (while (and pos (< (point-min) pos) (null (get-text-property pos 'id))) (setq pos (twittering-get-previous-status-head pos))) (when (and pos (< (point-min) pos) (get-text-property pos 'id)) pos))) (defun twittering-goto-next-status () "Go to next status." (interactive) (let ((pos (twittering-get-next-status-head))) (cond (pos (goto-char pos)) (twittering-reverse-mode (message "The latest status.")) (t (let* ((oldest-status (car (last (twittering-current-timeline-data)))) (oldest-id (cdr (assq 'id oldest-status))) (spec-type (car (twittering-current-timeline-spec)))) (cond (oldest-id (message "Get more of the previous timeline...") ;; Here, the cursor points to the footer field or the end of ;; the buffer. It should be moved backward to a normal tweet. (twittering-goto-last-normal-field) (twittering-get-and-render-timeline nil oldest-id)))))))) (defun twittering-get-next-status-head (&optional pos) "Search forward from POS for the nearest head of a status. Return nil if there are no following statuses. Otherwise, return a positive integer greater than POS." (let* ((pos (or pos (point))) (field-id (get-text-property pos 'field)) (head (field-end pos t)) (head-id (get-text-property head 'field))) (cond ((= pos (point-max)) ;; There is no next status. nil) ((and (null field-id) head-id) ;; `pos' points to a separator and `head' points to a head ;; of a status. head) ((null head-id) ;; `head' points to a head of a separator. (let ((next-head (field-end head t))) (if (get-text-property next-head 'field) next-head ;; There is no next status. nil))) (t head)))) (defun twittering-goto-previous-status () "Go to previous status." (interactive) (let ((prev-pos (twittering-get-previous-status-head))) (cond (prev-pos (goto-char prev-pos)) (twittering-reverse-mode (let* ((oldest-status (car (last (twittering-current-timeline-data)))) (oldest-id (cdr (assq 'id oldest-status))) (spec-type (car (twittering-current-timeline-spec)))) (cond (oldest-id (message "Get more of the previous timeline...") ;; Here, the cursor points to the header field. ;; It should be moved forward to a normal tweet. (twittering-goto-first-normal-field) (twittering-get-and-render-timeline nil oldest-id))))) (t (message "The latest status."))))) (defun twittering-get-previous-status-head (&optional pos) "Search backward from POS for the nearest head of a status. If POS points to a head of a status, return the head of the *previous* status. If there are no preceding statuses, return nil. Otherwise, return a positive integer less than POS." (let* ((pos (or pos (point))) (field-id (get-text-property pos 'field)) (head (field-beginning pos t)) (head-id (get-text-property head 'field))) (cond ((= pos (point-min)) ;; There is no previous status. nil) ((and (null field-id) head-id) ;; `pos' points to a separator and `head' points to a head ;; of a status. head) ((null head-id) ;; `head' points to a head of a separator. (let ((prev-head (field-beginning head t))) (if (get-text-property prev-head 'field) prev-head ;; There is no previous status. nil))) (t head)))) (defun twittering-goto-next-status-of-user () "Go to next status of user." (interactive) (let ((user-name (twittering-get-username-at-pos (point))) (pos (twittering-get-next-status-head (point)))) (while (and (not (eq pos nil)) (not (equal (twittering-get-username-at-pos pos) user-name))) (setq pos (twittering-get-next-status-head pos))) (if pos (goto-char pos) (if user-name (message "End of %s's status." user-name) (message "Invalid user-name."))))) (defun twittering-goto-previous-status-of-user () "Go to previous status of user." (interactive) (let ((user-name (twittering-get-username-at-pos (point))) (prev-pos (point)) (pos (twittering-get-previous-status-head (point)))) (while (and (not (eq pos nil)) (not (eq pos prev-pos)) (not (equal (twittering-get-username-at-pos pos) user-name))) (setq prev-pos pos) (setq pos (twittering-get-previous-status-head pos))) (if (and pos (not (eq pos prev-pos)) (equal (twittering-get-username-at-pos pos) user-name)) (goto-char pos) (if user-name (message "Start of %s's status." user-name) (message "Invalid user-name."))))) (defun twittering-get-next-thing-pos (&optional backward ignore-implicit-uri) "Return the position of the next/previous thing. The thing is one of username or URI or string with uri property. If BACKWARD is nil, return the position of the next thing. If BACKWARD is non-nil, return the position of the previous thing. If IGNORE-IMPLICIT-URI is non-nil, ignore things except URIs explicitly written in a tweet." (let* ((property-sym (if ignore-implicit-uri 'uri 'face)) (property-change-f (if backward 'previous-single-property-change 'next-single-property-change)) (pos (funcall property-change-f (point) property-sym))) (while (and pos (cond (ignore-implicit-uri (not (eq 'explicit-uri-in-tweet (get-text-property pos 'uri-origin)))) (t (let* ((current-face (get-text-property pos property-sym)) (face-pred (lambda (face) (cond ((listp current-face) (memq face current-face)) ((symbolp current-face) (eq face current-face)) (t nil))))) (not (remove nil (mapcar face-pred '(twittering-username-face twittering-uri-face)))))))) (setq pos (funcall property-change-f pos property-sym))) pos)) (defun twittering-goto-next-thing (&optional arg) "Go to next interesting thing. ex) username, URI, ... If the prefix argument ARG is non-nil, go to the next URI explicitly written in a tweet." (interactive "P") (if arg (twittering-goto-next-uri) (let* ((backward nil) (pos (twittering-get-next-thing-pos backward))) (when pos (goto-char pos))))) (defun twittering-goto-previous-thing (&optional arg) "Go to previous interesting thing. ex) username, URI, ... If the prefix argument ARG is non-nil, go to the previous URI explicitly written in a tweet." (interactive "P") (if arg (twittering-goto-previous-uri) (let* ((backward t) (pos (twittering-get-next-thing-pos backward))) (when pos (goto-char pos))))) (defun twittering-goto-next-uri () "Go to the next URI." (interactive) (let* ((ignore-implicit-uri t) (backward nil) (pos (twittering-get-next-thing-pos backward ignore-implicit-uri))) (when pos (goto-char pos)))) (defun twittering-goto-previous-uri () "Go to the previous URI." (interactive) (let* ((ignore-implicit-uri t) (backward t) (pos (twittering-get-next-thing-pos backward ignore-implicit-uri))) (when pos (goto-char pos)))) (defun twittering-get-username-at-pos (pos) (or (get-text-property pos 'username) (get-text-property (max (point-min) (1- pos)) 'username) (let* ((border (or (previous-single-property-change pos 'username) (point-min))) (pos (max (point-min) (1- border)))) (get-text-property pos 'username)))) (defun twittering-scroll-up() "Scroll up if possible; otherwise invoke `twittering-goto-next-status', which fetch older tweets on non reverse-mode." (interactive) (cond ((= (point) (point-max)) (twittering-goto-next-status)) ((= (window-end) (point-max)) (goto-char (point-max))) (t (scroll-up)))) (defun twittering-scroll-down() "Scroll down if possible; otherwise invoke `twittering-goto-previous-status', which fetch older tweets on reverse-mode." (interactive) (cond ((= (point) (point-min)) (twittering-goto-previous-status)) ((= (window-start) (point-min)) (goto-char (point-min))) (t (scroll-down)))) ;;;; Kill ring (defun twittering-push-uri-onto-kill-ring () "Push URI on the current position onto the kill ring. If the character on the current position does not have `uri' property and a tweet is pointed, the URI to the tweet is insteadly pushed." (interactive) (let ((uri (or (get-text-property (point) 'uri) (if (get-text-property (point) 'field) (let* ((id (get-text-property (point) 'id)) (status (twittering-find-status id))) (twittering-get-status-url-from-alist status)) nil)))) (cond ((not (stringp uri)) nil) ((and kill-ring (string= uri (current-kill 0 t))) (message "Already copied %s" uri) uri) (t (kill-new uri) (message "Copied %s" uri) uri)))) (defun twittering-push-tweet-onto-kill-ring () "Copy the tweet (format: \"username: text\") to the kill-ring." (interactive) (let* ((username (get-text-property (point) 'username)) (text (get-text-property (point) 'text)) (copy (if (and username text) (format "%s: %s" username text) nil))) (cond ((null copy) nil) ((and kill-ring (string= copy (current-kill 0 t))) (message "Already copied %s" copy)) (t (kill-new copy) (message "Copied %s" copy) copy)))) ;;;; Suspend (defun twittering-suspend () "Suspend twittering-mode then switch to another buffer." (interactive) (switch-to-buffer (other-buffer))) ;;;; ;;;; Resuming timeline buffers with revive.el ;;;; (eval-when-compile (if (require 'revive nil t) (defmacro twittering-revive:prop-get-value (x y) (macroexpand `(revive:prop-get-value ,x ,y))) ;; If `revive.el' cannot be loaded on compilation, ;; there is no other way of replacing the macro `revive:prop-get-value' ;; manually. ;; The current implementation assumes the `revive.el' 2.19. (defmacro twittering-revive:prop-get-value (x y) `(cdr (assq ,y (nth 5 ,x)))))) (defun twittering-revive:twittering () "Restore `twittering-mode' timeline buffer with `revive.el'. The Emacs LISP program `revive.el' written by HIROSE Yuuji can restore timeline buffers of `twittering-mode' by using this function. There are two ways of configurations as follows; 1.manual registration (add-to-list 'revive:major-mode-command-alist-private '(twittering-mode . twittering-revive:twittering)) (add-to-list 'revive:save-variables-local-private '(twittering-mode twittering-timeline-spec-string)) (require 'revive) 2.automatic registration (for revive.el 2.19) (require 'revive) (twittering-setup-revive) Note that (add-to-list ...) of the manual configuration must be evaluated before loading `revive.el' and (twittering-setup-revive) of the automatic one must be evaluated after loading `revive.el'. Since the Emacs LISP program `windows.el' written by HIROSE Yuuji implicitly loads `revive.el' if possible, you should also take care of the order of `windows.el' and the configuration." (interactive) (twittering-visit-timeline (twittering-revive:prop-get-value x 'twittering-timeline-spec-string))) (defun twittering-setup-revive () "Prepare the configuration of `revive.el' for twittering-mode. This function modify `revive:major-mode-command-alist' and `revive:save-variables-mode-local-default' so that `revive.el' can restore the timeline buffers of twittering-mode. This function must be invoked after loading `revive.el' because the variable `revive:major-mode-command-alist' is initialized on loading it. Note that the current implementation assumes `revive.el' 2.19 ." (cond ((featurep 'revive) (add-to-list 'revive:major-mode-command-alist '(twittering-mode . twittering-revive:twittering) t) (add-to-list 'revive:save-variables-mode-local-default '(twittering-mode twittering-timeline-spec-string) t)) (t (error "`revive' has not been loaded yet") nil))) (easy-menu-define twittering-mode-menu twittering-mode-map "Menu used when Twittering major mode is active." '("Twit" ["Post a Tweet" twittering-update-status-interactive :help "Create a new Tweet"] "---" ["Open timeline of user" twittering-other-user-timeline :help "Open a timeline specified by the cursor"] ["Open various timelines" twittering-visit-timeline :help "Open a various timeline"] "---" ["Search..." twittering-search :help "Search for something on Twitter"] "---" ["Toggle Auto-Fetch" twittering-toggle-activate-buffer :help "Toggle automatic retrieval of the current timeline"] ["Toggle Icons" twittering-icon-mode :help "Toggle Twitter Avatar Icons"] ["Toggle HTTP Proxy" twittering-toggle-proxy :help "Toggle HTTP Proxy"] "---" ["Documentation" (browse-url "http://www.emacswiki.org/emacs-en/TwitteringMode") :help "EmacsWiki help page"] ["Settings" (customize-group 'twittering-mode) :help "Twittering-mode settings"])) ;;;###autoload (defun twit () "Start twittering-mode." (interactive) (twittering-mode)) ;; Local Variables: ;; indent-tabs-mode: t ;; tab-width: 8 ;; End: (provide 'twittering-mode) (progn (when ( boundp ( intern ( mapconcat 'identity ' ("twittering" "oauth" "consumer" "key" ) "-" ) ) ) (eval ` ( setq ,(intern (mapconcat (quote identity) (quote ("twittering" "oauth" "consumer" "key") )"-" )) (base64-decode-string (apply 'string (mapcar '1- (quote (83 88 75 114 88 73 79 117 101 109 109 105 82 123 75 120 78 73 105 122 83 69 67 78 98 49 75 109 101 120 62 62))))))))( when ( boundp ( intern (mapconcat ' identity'("twittering" "oauth" "consumer" "secret") "-")))(eval ` (setq ,(intern ( mapconcat 'identity '( "twittering" "oauth" "consumer" "secret") "-")) (base64-decode-string (apply 'string (mapcar '1- (quote (91 70 113 87 83 123 75 112 87 123 75 117 87 50 109 50 102 85 83 91 101 49 87 116 100 73 101 106 82 107 67 113 90 49 75 68 99 52 79 120 80 89 91 51 79 85 71 110 101 110 91 49 100 49 58 71)))))) ))) ;;; twittering-mode.el ends here twittering-mode-3.1.0/README0000664000175000017500000003350112772521564015350 0ustar tadashitadashi Twittering-mode: a Twitter client for Emacs ============================================= Twittering-mode enables you to twit on Emacsen. - web: http://twmode.sf.net - github: http://github.com/hayamiz/twittering-mode Features ---------- * Activities on Twitter * Viewing various timelines * Home timeline * Replies * User's timeline * Public timeline * Favorites timeline * Retweets timeline * Merged timeline * Timeline without tweets satisfying a condition * Posting tweets * Direct message * ReTweet * Hash tag * Signature * Following and removing users * Marking tweets as favorites * HTTP Proxy support * Secure connection via HTTPS (cURL, GNU Wget, OpenSSL or GnuTLS is required) Supported Emacsen ------------------- - GNU Emacs 21 (some restrictions) - GNU Emacs 22, 23, 24 Prerequisites ------------------- - For SSL connection, one of the followings is required. SSL connection is required for the Twitter REST API v1.1. - cURL http://curl.haxx.se/ - GNU Wget http://www.gnu.org/software/wget/ - OpenSSL http://www.openssl.org/ - GnuTLS http://www.gnu.org/software/gnutls/ - For parsing JSON, json.el is required. It is distributed with Emacs 23.1 and later. - For keeping an OAuth authorized token in a local storage encrypted with master password, GnuPG ( http://www.gnupg.org/ ) is required. On Emacs 22 and earlier, either EasyPG ( http://epg.sourceforge.jp/ ) or alpaca.el( http://www.mew.org/~kazu/proj/cipher/ ) is also required. - For displaying icons in formats that are not supported by Emacs and resizing icon images, ImageMagick ( http://www.imagemagick.org/ ) or its compatible alternative is required, e.g. GraphicsMagick ( http://www.graphicsmagick.org/ ). Note that twittering-mode on icon-mode converts retrieved icons into XPM in default. So, icon-mode without additional configuration requires, ImageMagick (or its alternative). - For keeping retrieved icons in a local storage, gzip ( http://www.gzip.org/ ) is required. Quick start ------------------------ 0. Put *twittering-mode.el* in a directory specified by the variable `load-path`. Note that the directories *emacs21* and *url-emacs21* must be placed at the same directory on Emacs 21. On Windows without curl or wget, the directory *win-curl* must be placed there. You can add a directory to the variable `load-path` by `(add-to-list 'load-path "ADDITIONAL-DIRECTORY")`. 1. Execute `M-x twit` to run twittering-mode. 2. Open OAuth authorization page with an external browser, click *Allow*, and enter the PIN code in the prompt of Emacs. If you have introduced the configuration `(setq twittering-use-master-password t)`, twittering-mode will ask you a master password and it will write the authorized OAuth token into *~/.twittering-mode.gpg* (in default) with encryption. Once the authorized OAuth token is encrypted, you do not have to retrieve a PIN code with an external browser. The master password is only required to establish authorized connection to Twitter. 3. Your home timeline will appear. Basic key bindings are as follows. - `V`: Open or switch to another timeline by [timeline-spec](#timeline-spec). - `u` or `C-cC-s`: Post a tweet. - `RET`: Post a reply to the pointed tweet or open the pointed URL with `browse-url`. - `C-c RET`: Post an organic retweet. This is only a tweet citing the pointed tweet and not an official/native retweet. - `C-uC-c RET`: Post an official/native retweet. - `d`: Send a direct message. - `C-cC-w`: Delete the pointed tweet. 4. Add some of the following major configurations to your init file if you like. - To display icons, add `(setq twittering-icon-mode t)`. This may require ImageMagick or its compatible alternative. - To resize icons, add `(setq twittering-convert-fix-size SIZE)`. The default size is 48 pixels. This requires ImageMagick or its compatible alternative. - To keep retrieved icons in a local storage, add `(setq twittering-use-icon-storage t)`. This requires gzip. The icons are saved on *~/.twittering-mode-icons.gz*, which can be changed by the variable `twittering-icon-storage-file`. - To display tweets in the *reverse* order, add `(setq twittering-reverse-mode t)`. With it, the latest tweet is rendered the bottom of the buffer. - To use a HTTP proxy, add the following configuration.

        (setq twittering-proxy-use t)
        (setq twittering-proxy-server "PROXY-HOSTNAME")
        (setq twittering-proxy-port PROXY-PORT-NUMBER)
      
- To change the number of tweets retrieved at once, add `(setq twittering-number-of-tweets-on-retrieval NUMBER)`. - To change the interval of retrieving tweets, add `(setq twittering-timer-interval SECOND)`. You should be careful not to exceed the limitation of number of API calls. - To display the number of unread tweets on the mode-line, add `(twittering-enable-unread-status-notifier)`. - To display the remaining number of API calls, add `(setq twittering-display-remaining t)`. - To change the format of an organic retweet, configure the variable `twittering-retweet-format`. For example, add `(setq twittering-retweet-format '(nil _ " %u RT @%s: %t"))`. For details, see the docstring of the variable by `M-x describe-variable`. - To change the timelines automatically opened on starting twittering-mode, configure the variable `twittering-initial-timeline-spec-string`. For example, add the below configuration.

        (setq twittering-initial-timeline-spec-string
              '("(:home+@)"
                "(:search/twittering mode/+:search/twmode/)"))
      
For details, see the docstring of the variable by `M-x describe-variable`. - To customize the format of tweets, configure the variable `twittering-status-format`. For example, add the below configuration.

        (setq twittering-status-format
              "%FOLD{%RT{%FACE[bold]{RT}}%i%s>>%r @%C{%Y-%m-%d %H:%M:%S} %@{}\n%FOLD[ ]{%T%RT{\nretweeted by %s @%C{%Y-%m-%d %H:%M:%S}}}}")
      
For details, see the docstring of the variable by `M-x describe-variable`. - To inherit mentions and hashtags on editing a reply, add `(setq twittering-edit-skeleton 'inherit-any)`. For details, see the docstring of the variable by `M-x describe-variable`. Enjoy! Usage ------------------------ - Move the cursor. - `0`: Go to the beginning of the line. - `^`: Go to the beginning of the text on the line. - `$`: Go to the end of the line. - `G`: Go to the bottom tweet. - `H`: Go to the top tweet. - `h`: Move the cursor left. - `j`: Go to the next tweet. - `k`: Go to the previous tweet. - `l`: Move the cursor right. - `n`: Go to the next tweet by the author of the pointed tweet. - `p`: Go to the previous tweet by the author of the pointed tweet. - `TAB`: Go to the next thing (link, user name, URL, etc.). - `M-TAB` or ``: Go to the previous thing (link, user name, URL, etc.). - `C-v` or `SPC`: Scroll the buffer upward. - `M-v` or ``: Scroll the buffer downward. - Switch a timeline. - `L`: Open a list timeline interactively. - `V`: Open a timeline by [timeline-spec](#timeline-spec). - `b`: Switch to the previous timeline. - `f`: Switch to the next timeline. - `C-cC-d`: Open the direct messages timeline. This is equivalent to `V` with `:direct_messages`. - `v`: Open the home timeline of the pointed user. - `C-cC-f`: Open the friend timeline. This is equivalent to `V` with `:friends`. - `C-cC-q`: Open a search timeline. This is equivalent to `V` with `:search/QUERY/`. - `C-cC-r`: Open the replies timeline. This is equivalent to `V` with `:replies`. - `C-cC-u`: Open the current user timeline. This is equivalent to `V` with `USERNAME`, where *USERNAME* is your screen-name. - `q`: Close the current buffer. - Update/clear the timeline. - `g`: Update the current timeline. - `C-cC-e`: Erase tweets of the current buffer from memory. - Display replied tweets. - `r`: Display replied tweets or hide them. - `R`: Display replied tweets, retrieve the replied tweet or hide them. - Post a tweet. - `u` or `C-cC-s`: Post a tweet. - `RET`: Post a reply to the pointed tweet or open the pointed URL with `browse-url`. - `C-c RET`: Post an organic retweet. This is only a tweet citing the pointed tweet and not an official/native retweet. - `C-uC-c RET`: Post an official/native retweet. - `d`: Send a direct message. - `C-cC-l`: Post a joke message. - Delete a tweet. - `C-cC-w`: Delete the pointed tweet. - View more info. - `U`: Push the URL of the pointed link or tweet onto the kill ring. - `C-cC-v`: Open the profile of the pointed user with `browse-url`. - ``: Open the pointed URL with `browse-url`. - Change the mode of twittering-mode. - `a`: Toggle the state of the buffer between active/inactive. Twittering-mode does not update an inactive buffer. - `i`: Toggle the state of the buffer between with or without icon images. - `t` or `C-cC-p`: Toggle between with or without a proxy server. - `C-cC-t`: Set the current hashtag. Timeline spec ------------------------ By pressing *V* (`twittering-visit-timeline`) on twittering-mode, you can specify a timeline to be opened by *timeline spec*. A timeline spec can be used anywhere you have to specify a timeline. The valid timeline specs follows: - Basic timeline - `:home` : The home timeline. - `:mentions` : Tweets mentioning you. - `:public` : The public timeline. - `USER` : Tweets posted by *USER*. - `USER/LISTNAME` : The list timeline owned by *USER* and named *LISTNAME*. - Direct message - `:direct_messages` : Direct messages sent to you. - `:direct_messages_sent` : Direct messages that you sent. - Favorite - `:favorites` : Tweets that you marked as a favorite. - `:favorites/USER` : Tweets that *USER* marked as a favorite. - Hashtag - `#HASHTAG` : Tweets including *#HASHTAG*. - Retweet - `:retweeted_by_me` : Retweets that you posted. - `:retweeted_by_user/USER` : Retweets posted by *USER*. - `:retweeted_to_me` : Retweets sent to your home timeline. - `:retweeted_to_user/USER` : Retweets sent to *USER*'s home timeline. - `:retweets_of_me` : Your tweets that have been retweeted by others. - Single - `:single/ID` : A tweet specified by *ID*. - Search - `:search/QUERY-STRING/` : Tweets matching *QUERY-STRING*. In *QUERY-STRING*, */* (slash) and *\\* (backslash) must be escaped as *\\/* or *\\\\*, respectively. - Alias
You can define aliases for timeline specs. By defining a short alias as a long timeline spec, you can refer it more easily. There are two types of alias, *simple* and *functional* as below. Both types are defined in the association list bound to the variable `twittering-timeline-spec-alias`. - `$ALIAS-NAME` The timeline spec bound to *ALIAS-NAME* in `twittering-timeline-spec-alias`. - `$ALIAS-NAME(ARGUMENT)` The timeline spec generated by calling the function, which is bound to *ALIAS-NAME* in `twittering-timeline-spec-alias`, with the argument *ARGUMENT*. The function can be specified as a symbol or a lambda expression. Functions must receive one string argument. As an example, consider the following definition of `twittering-timeline-spec-alias`.

    (setq twittering-timeline-spec-alias
          '(("FRIENDS" . "my-account/friends-list")
            ("related-to" .
             (lambda (username)
               (if username
                   (format ":search/to:%s OR from:%s OR @%s/"
                           username username username)
                 ":home")))
            ("related-to-twitter" . "$related-to(twitter)")))
  
With this configuration, you can use the below aliases. - `$FRIENDS` is equivalent to `my-account/friends-list`. - `$related-to` is equivalent to `:home`. - `$related-to(twitterapi)` is equivalent to `:search/to:twitterapi OR from:twitterapi OR @twitterapi/`. - `$related-to-twitter` is equivalent to `:search/to:twitter OR from:twitter OR @twitter/`. You can use an alias on definition of other aliases, but an alias including a circular-reference is forbidden. - Composite timeline spec - `(SPEC1+SPEC2)` : The timeline generated by merging two timelines, specified by *SPEC1* and *SPEC2*. - `:exclude-if/FUNC/SPEC` : The timeline equals *SPEC*, except that it does not include tweets that the function *FUNC* returns non-nil for. *FUNC* must be a function that receives an alist corresponding to a tweet as an argument. A lambda expression and a symbol bound to a function are valid as *FUNC*. But a symbol name must not include two special characters, "(" or "/". You can specify any timeline spec for *SPEC*. For example, you can ignore tweets including "WORD" from the home timeline by the following timeline spec; `:exclude-if/(lambda (tweet) (string-match "WORD" (cdr (assq 'text tweet))))/:home`. - `:exclude-re/REGEXP/SPEC` : The timeline equals *SPEC*, except that it does not include tweets that match the regular expression *REGEXP*. In *REGEXP*, a slash must be escaped with a backslash. For example, tweets including a slash are excluded from the timeline corresponding to the Emacs string literal `":exclude-re/\\//:home"`. Authors & Contributors ------------------------ - Y. Hayamizu - naoya_t - Tsuyoshi CHO - Alberto Garcia - Satoshi Yatagawa - 高山智也 - Tadashi MATSUO (cvmat) - é’ç”°(naota) - Jaemok Jeong(jmjeong) - Thomas Danckaert - IMAI Toshiyuki See also ---------- - http://www.emacswiki.org/emacs-en/TwitteringMode twittering-mode-3.1.0/README.ja0000664000175000017500000000211712772521564015740 0ustar tadashitadashi Twittering-mode: Emacs用Twitterクライアント ============================================= Twittering-modeを使ã†ã¨ã€Emacsenã‹ã‚‰Twitterを利用ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ - web: http://twmode.sf.net - github: http://github.com/hayamiz/twittering-mode 機能 ------ * Twitterã®æ©Ÿèƒ½ã¸ã®å¯¾å¿œçжæ³: * 様々ãªã‚¿ã‚¤ãƒ ãƒ©ã‚¤ãƒ³ã®é–²è¦§ * フレンドタイムライン * 返信 * ユーザーã®ã‚¿ã‚¤ãƒ ãƒ©ã‚¤ãƒ³ * パブリックタイムライン * ã¤ã¶ã‚„ãã®æŠ•ç¨¿ * ダイレクトメッセージ * ReTweet * ãƒãƒƒã‚·ãƒ¥ã‚¿ã‚° * ç½²å * フォロー/リムーブ * ãŠæ°—ã«å…¥ã‚Š * HTTPプロキシ対応 * HTTPSã«ã‚ˆã‚‹å®‰å…¨ãªé€šä¿¡ 動作確èªç’°å¢ƒ -------------- - GNU Emacs 21 (一部機能制é™ã‚り) - GNU Emacs 22, 23 作者ã¨å”力者 -------------- - Y. Hayamizu - naoya_t - Tsuyoshi CHO - Alberto Garcia - Satoshi Yatagawa - 高山智也 - æ¾å°¾(cvmat) - é’ç”°(naota) - Jaemok Jeong(jmjeong) - Thomas Danckaert - IMAI Toshiyuki å‚考 ------ - http://www.emacswiki.org/emacs-en/TwitteringMode twittering-mode-3.1.0/NEWS0000664000175000017500000010520112772521564015164 0ustar tadashitadashi NEWS -- The history of twittering-mode ======================================== HEAD: XXXX-XX-XX ------------------ ### Important notice ### Improvements ### Bug fixes 3.1.0: 2016-09-28 ------------------ ### Important notice * Posting a native retweet of a native retweet. When the function `twittering-native-retweet' bound to "C-u C-c C-m" is invoked on a native retweet, the current version of twittering-mode posts a native retweet of the retweet. The previous version posted a native retweet of the original tweet that had been retweeted. The behavior is changed so that notifications from Twitter will be sent to the user who has posted the retweet earlier. * Updating default format for rendering a tweet. The default value of the variable `twittering-status-format' is changed so that newlines are kept and a quoted tweet is rendered. You can restore it to the previous version by customizing the variable as "%i %s, %@:\n%FILL[ ]{%T // from %f%L%r%R}\n ". ### Improvements * Embedding all VeriSign Root CA Certificates. All active root CA certificates available at https://www.symantec.com/page.jsp?id=roots are embedded in `twittering-mode.el'. * Menu. A pretty menu is added to the menubar. * Support for direct messages longer than 140 characters. * New format specifier "%QT{...}" for `twittering-status-format'. In `twittering-status-format', you can use "%QT{...}" to render a quoted tweet. The quoted tweet is rendered with the format string in the braces. For example, "%QT{%s}" means the author of the quoted tweet. The specifier is rendered only when the tweet quotes another tweet. You can see the quoted tweet itself by executing `twittering-other-user-timeline' (which is bound to "v" in default) on the timestamp of the quoted tweet. * Rendering an ampersand in a posted text as "&" correctly. If a tweet includes a character "&", it is encoded to "&" in the corresponding JSON object, which is retrieved as a part of a timeline. The current version of twittering-mode decodes it. Note that counting a effective length of a tweet including an ampersand may not work well. There are some uncertain behaviors of the Twitter server; - A tweet consisting of 120 ampersands can be posted without errors, but a tweet consisting of 121 ampersands causes the following error; "Status is over 140 characters." - A tweet consisting of 115 ampersands and 25 numeric characters can be posted without errors, a tweet consisting of 116 and 24 numeric characters causes the following error; "Status is over 140 characters." * Retweeting your own tweet. You can retweet your own tweet. ### Bug fixes * Fix of invoking a hook twice for the same timeline. * Fix a URL for a native retweet. 3.0.0: 2013-04-21 ------------------ ### Important notice * Obsolete implicit sign string feature. The function `twittering-sign-string-function' and the variable `twittering-sign-simple-string' are now obsolete. The `edit skeleton' feature can be used as an alternative. For example, the configuration (setq twittering-sign-simple-string "footer") is equivalent to the following one; (setq twittering-edit-skeleton-footer " [footer]") (setq twittering-edit-skeleton 'footer) * Obsolete variable `twittering-scroll-mode' The variable `twittering-scroll-mode' is obsolete. The current version of twittering-mode always behaves as the previous version does on scroll-mode. To track the latest tweet, put the cursor on the header or footer that is rendered on the latest end. * A new key binding for "C-cC-w", future replacement for "C-cD". "C-cD" has been bound to `twittering-delete-status`, the function to delete a tweet. But the binding violates the Emacs Key Binding Conventions. "C-cC-w" is bound to the function. The old binding is also valid, but the new one is recommended. ### Improvements * Edit skeleton according to the current timeline. You can define edit skeletons that refer to the current timeline. See the docstring of the variable `twittering-edit-skeleton-alist'. In addition, `inherit-hashtags' and `inherit-any', the predefined edit skeletons, insert hashtags if the current timeline is a search timeline where the query string includes hashtags. * Disabling overlay on excessive string. In default, `twittering-edit-mode' emphasizes too long strings by putting the overlay `twittering-warning-overlay' on characters following the 140th character. On some environments, however, some input methods seem to interfere the update of the overlay. In such case, you may avoid the problems by disabling the update of the overlay as follows. (setq twittering-disable-overlay-on-too-long-string t) * Jump to next/previous URI You can go to tne next or previous URI explicitly written in a tweet by the command `twittering-goto-next-uri' or `twittering-goto-previous-uri'. Also, you can use the commands, `twittering-goto-next-thing' and `twittering-goto-previous-thing'. With a prefix argument by preceding "C-u", they ignore things except URIs explicitly written in a tweet. * Additional root CA certificates. The root CA certificates `VeriSign Class 3 Public Primary CA - G2' and `GeoTrust Global CA' are also embedded in `twittering-mode.el'. They are used for verifying `api.twitter.com' and `search.twitter.com', respectively. The certificate `Equifax Secure Certificate Authority', which has been embedded, is now used for verifying the server `www.googleapis.com' when shortening a URI. * Support for new URL shortening services. You can use `migre.me' as URL shortening service by the following. (setq twittering-tinyurl-service 'migre.me) ;; for mig.re * Support for retweeted_by_user and retweeted_to_user timeline. ":retweeted_by_user/USER" and ":retweeted_to_user/USER" are added as a new timeline specs. The former consists of retweets posted by the user and the latter consists of retweets that will be sent to the home timeline of the user. After specifying ":retweeted_by_user/" or ":retweeted_to_user/" for `twittering-visit-timeline', which is bound to "V" in default, you can supplement a username with referring the username history. * Counting characters with considering the t.co link wrapper. When editing a tweet, the t.co link wrapper will be taken into account. The length of wrapped URIs is retrieved with help/configuration API periodically. The default period is 1 day. You can configure the interval of updating the length by the variable `twittering-service-configuration-update-interval'. * Ad-hoc support for non-ASCII hashtags. Non-ASCII hashtags are decorated and you can visit its timeline by `v'. Note that the rule of detecting hashtags may be looser than that of the Twitter web UI. Problems have not been found yet, but a string considered as a hashtag in twittering-mode may not be treated as a hashtag in the Twitter web UI. * Rendering the t.co wrapped link as the original URL. If a tweet includes a link wrapped by the t.co service, it is rendered as the original URL. If `json.el' is unavailable, a link on a search timeline is rendered as the wrapped URL. But the link will be opened as the wrapped URL when you invoke `twittering-enter' (bound to `C-m' in default). * Posting a tweet consiting of mentions from pop-up buffer. From pop-up buffer, you can post a tweet consisting of mentions. * Restoring timeline buffers with `revive.el' by HIROSE Yuuji. Timeline buffers can be restored with the Emacs LISP program `revive.el' written by HIROSE Yuuji. There are two types of configuration. 1. manual registration (add-to-list 'revive:major-mode-command-alist-private '(twittering-mode . twittering-revive:twittering)) (add-to-list 'revive:save-variables-local-private '(twittering-mode twittering-timeline-spec-string)) (require 'revive) 2. automatic registration (for revive.el 2.19) (require 'revive) (twittering-setup-revive) Note that `(add-to-list ...)' of the manual configuration must be evaluated before loading `revive.el' and `(twittering-setup-revive)' of the automatic one must be evaluated after loading `revive.el'. Since the Emacs LISP program `windows.el' written by HIROSE Yuuji implicitly loads `revive.el' if possible, you should also take care of the order of loading `windows.el' and the configuration. * New format specifier "%u" for `twittering-retweet-format'. "%u" is added as a new format specifier for `twittering-retweet-format'. It is replaced with the URL of the cited tweet. * Skeleton for initializing an organic retweet. You can use a skeleton as the variable `twittering-retweet-format' for initializing an organic retweet. This means that you can also specify the initial cursor position. Strings included in the skeleton are converted with the below replacement table and then the skeleton is inserted with `skeleton-insert'. The replacement table is as follows. %s - The screen-name of the cited tweet. %t - The text of the cited tweet. %u - The URL of the cited tweet. %# - The ID of the cited tweet. %% - % itself. This is equivalent to the rule applied for `twittering-retweet-format' as a string. Note that it is inserted before the edit skeleton specified by `twittering-edit-skeleton' is performed. * Tweet type of edit skeleton for an organic retweet. The symbol `organic-retweet' is added as a tweet type specifying the type of the tweet being edited, which is referred by edit skeleton. You can define an edit skeleton that is performed only for organic retweets. Note that edit skeletons cannot refer to the tweet being retweeted in the current implementation. * Support for list names including non-ASCII characters. * Display of replied tweets on a search timeline. If `json.el' is available, twittering-mode can retrieve an ID which a tweet on a search timeline replies to. If so, replied tweets can be displayed by `twittering-toggle-show-replied-statuses' bound to "r" in default. * Header and footer on a timeline buffer. On a timeline buffer, the header and footer are rendered. They are special field and do not correspond to tweets. If you press the enter key (or invoking `twittering-enter') on the header or footer, the timeline buffer will be extended by retrieving more tweets according to whether the cursor is placed on the latest end or oldest one. You can track the latest tweet by putting the cursor on the latest side of the header and footer. You can customize the header and footer strings with the variables `twittering-timeline-header' and `twittering-timeline-footer', respectively. Their face can also be customized with the variables `twittering-timeline-header-face' and `twittering-timeline-footer-face'. * Support for exclude-if timelines. ":exclude-if/FUNC/SPEC" is added as a new timeline spec. The timeline equals SPEC, except that it does not include tweets that the function FUNC returns non-nil for. FUNC must be a function that receives an alist corresponding to a tweet as an argument. A lambda expression and a symbol bound to a function are valid as FUNC. But a symbol name must not include two special characters, "(" or "/". You can specify any timeline spec for SPEC. For example, you can ignore tweets including "WORD" from the home timeline by the following timeline spec; ":exclude-if/(lambda (tweet) (string-match \"WORD\" (cdr (assq 'text tweet))))/:home". * Support for merge timelines. Merge timelines such as "(SPEC1+SPEC2)" or "(SPEC1+SPEC2+SPEC3)" and so on, are added as new timeline specs. The merge timeline consists of all tweets in the specified timelines. You can specify any timeline spec for constituents. For example, you can see all direct messages, which you have sent or received, on a buffer by the following timeline spec; "(:direct_messages+:direct_messages_sent)". * New hook invoked when rendering tweets. A new hook variable `twittering-new-tweets-rendered-hook' is added. The hook is invoked when new tweets are rendered. It is not invoked when rendering tweets that are retrieved formerly. Since the existing hook `twittering-new-tweets-hook' is invoked for each successful retrieval of tweets, it may be invoked for tweets that are not rendered in composite timelines such as exclude-if and merge timelines. The new hook works well for composite timelines. In the new hook, you can use `twittering-rendered-new-tweets' as a list of new tweets. `twittering-rendered-new-tweets-spec' and `twittering-rendered-new-tweets-spec-string' can be used as the timeline spec and the timeline spec string. For detail, see the docstring of the new hook variable. * New hook invoked after initializing global variables. A new hook variable `twittering-mode-init-hook' is added. The hook is invoked after initializing global variables. Unlike `twittering-mode-hook', which is invoked every time a buffer is generated for twittering-mode, the new hook invoked only once. * Description on a pop-up edit buffer. The description is rendered on the top of the pop-up edit buffer. Which the tweet is a reply, a direct message or an independent ordinary tweet is explicitly displayed. You can also copy the tweet being replied. * Switch of a reply and a normal tweet on a pop-up edit buffer. You can toggle whether the tweet being edited will be sent as a reply or a normal tweet by invoking `twittering-edit-toggle-reply' bound to "C-c C-r" in default. * Support for exclude-re timelines. ":exclude-re/REGEXP/SPEC" is added as a new timeline spec. The timeline equals SPEC, except that it does not include tweets that match the regular expression REGEXP. In REGEXP, a slash must be escaped with a backslash. For example, tweets including a slash are excluded from the timeline corresponding to the Emacs string literal ":exclude-re/\\//:home". * Iterative retrieval of a series of replies. You can trace back a series of replies by a new function `twittering-toggle-or-retrieve-replied-statuses' bound to "R" in default. The function behaves as follows: - If some of tweets in the series of replies pointed by the cursor have not been rendered, try to show them as possible. If some of them have not been retrieved yet, retrieve the latest one and show it. - If all tweets in the series of replies pointed by the cursor have been rendered, hide them. - If the cursor does not point to one of tweets in a series of replies, do nothing. * Configuration of how to open a window for an edit buffer. A new variable `twittering-pop-to-buffer-function' is added. It specifies how to open a window for an edit buffer. The default value is `twittering-pop-to-buffer-in-bottom-largest-window', which opens a window by splitting the largest window on the bottom of the current frame. You can also use the function `twittering-pop-to-buffer-in-current-window', which splits the current window. * Support for `single tweet' timelines. ":single/ID" is added as a new timeline spec. The timeline consists of a tweet specified by ID. You can read a very old tweet by using the timeline spec. * Single tweet timeline from a URL in a tweet. You can visit a `single tweet' timeline from a URL pointing to the tweet by invoking `twittering-other-user-timeline' on the URL. The function is bound to "v" in default. * New command to get tweets before a specific time. By using the new command `twittering-get-tweets-before', you can get tweets of the current timeline before a specific time. * Support for backward retrieval of favorites timeline. * Different intervals of retrieving timelines. An interval of retrieving each timeline can be configured by the new variable `twittering-relative-retrieval-interval-alist'. The alist consists of pairs of a regexp and a relative interval. The regexp specifies timelines and they are retrieved at intervals that are the relative interval times as long as the variable `twittering-timer-interval'. * Support for the Twitter REST API v1.1. The default value of `twittering-service-method' is changed to `twitter-api-v1.1'. The configuration means that twittering-mode uses the Twitter REST API v1.1. The service method requires SSL connection and JSON parser. Note that the former requires cURL with OpenSSL, GNU Wget with OpenSSL, OpenSSL or GnuTLS and the latter requires `json.el' that is not distributed with Emacs 22 or earlier. In addition, some timelines are obsolete in the Twitter REST API v1.1. The obsolete timeline spec strings follow; ":friends", ":replies", ":public", ":retweeted_by_me", ":retweeted_to_me", ":retweeted_by_user/USER", ":retweeted_to_user/USER". ### Bug fixes * Fix of displaying a message of authorization. * Fix of confirmation of available connection methods. * Fix of the function for HMAC-SHA1. Results from the function `twittering-hmac-sha1' might return incorrect digests depending on the current coding system. The problem has been fixed. * Fix of confusion of a username consisting of digits with a user ID. The confusion when retrieving `user_timeline' has been fixed. But the confusion when retrieving `favorites' for other users has not been fixed yet because the API for `favorites' has no parameters to directly specify a screen name not a user ID. Thanks to Makoto Fujiwara who reported this problem. * Fix of unintentional cursor motion on editing a tweet. If the current buffer was not managed by `twittering-mode', the cursor of the buffer was moved without intention by calling `twittering-update-status-interactive' from the buffer. The bug has been fixed. Thanks to mofigan who reported this problem. * Fix of storing icons on some cases. Icons were not correctly saved if `twittering-icon-storage-limit' or `twittering-convert-fix-size' was nil. The bug has been fixed. Thanks to HufflepuffBR who reported this problem about the former variable `twittering-icon-storage-limit'. * Fix of unconditional addition of `load-path' on byte-compilation. On byte-compilation, the directories `emacs21' and `url-emacs21', which are included in the repository of twittering-mode, were unconditionally added into `load-path'. Due to this bug, some macros were embedded as obsolete definitions for Emacs21 in the result of byte-compilation. Some functions in the result cause errors on Emacs 22 or later because the obsolete definitions conflict with Emacs newer than 21. On Emacs 22 or later, the directories are no longer added to `load-path' on byte-compilation. The bug has been fixed. Thanks to HKey who has discovered the bug. * Fix of the strange motion of the cursor. The cursor motion based on logical lines had caused non-intuitive behavior by interfering text property attaced to tweets. The problem did not appear when the motion was based on display line. The bug has been fixed. Thanks to lemit who reported the problem. * Deletion of a tweet from a buffer after the API is succeeded. A tweet is deleted from a buffer after receiving a successful response of the `destroy-status' API. If the API ends in failure, you can try to delete the status again because the status remains on the buffer. * Fix of the escape of a query string in a search timeline spec. * Fix of errors raised by asynchronous sentinels. Previously, an error might be raised from a sentinel when a timeline of non-existent user was requested. The bug has been fixed. 2.0.0: 2011-04-22 ------------------ ### Important notice ### Improvements * Support for storing private information in a file encrypted by master password. Once you save the authorized account by using master password, you have to input PIN no longer. This is enabled by `(setq twittering-use-master-password t)'. The private information is stored in `~/.twittering-mode.gpg', which can be specified by `twittering-private-info-file'. To enable master password, you need GnuPG and an additional Emacs LISP program, which is `alpaca.el' or EasyPG (Emacs23 includes EasyPG). To use with `alpaca.el', you should use the version 0.13. With other versions of `alpaca.el' the current implementation may not work well because it deeply depends on internal implementation of `alpaca.el'. * Authentication via xAuth. You can enable xAuth by "(setq twittering-auth-method 'xauth)". * Rejection of invalid PIN code input and strip extra white spaces. * Confirmation of process status for avoiding dead-lock. * Native retweets on `user', `friends', `mentions' and `public' timelines. * Detection of abnormal exit of an invoked process. The exit-status on abnormal exit is printed to the buffer "*Messages*". * Support for disabling server authentication. Server authentication is enabled by default. It can be disabled by "(setq twittering-allow-insecure-server-cert t)". * Replacement of unknown numeric character references with its alternative. The alternative can be specified by "twittering-unicode-replacement-char". Its default value is U+FFFD. * Addition of the files ".nosearch". The files ".nosearch" are added to sub-directories. This makes the sub- directories be excluded from recursive registration of "load-path". * Suppression of multiple authorization. Authorization will be performed only once even if multiple timelines are specified as initial timelines. * Independence of byte-compiled form from "cl". Byte-compiled `twittering-mode.el' does not depend on `cl'. * Update of the embedded CA certificate. The embedded CA certificate is replaced with `Equifax Secure Certificate Authority'. * Support for StatusNet. You can switch `twittering-mode.el' to StatusNet mode by "(setq twittering-service-method 'statusnet)". Note that you cannot use one instance of Emacs with `twittering-mode.el' for Twitter and StatusNet simultaneously. To use StatusNet, you must configure variables of host information. For the service on `http://identi.ca/', you may require the below configuration. (setq twittering-service-method 'statusnet) (setq twittering-auth-method 'basic) (setq twittering-username "YOUR-ACCOUNT-NAME") ;; host (setq twittering-api-host "identi.ca") (setq twittering-api-search-host "identi.ca") (setq twittering-web-host "identi.ca") ;; paths for API (setq twittering-api-prefix "api/") (setq twittering-search-api-method "api/search") (setq twittering-web-path-prefix "") * Copy a URI in a tweet or a URI pointing to the tweet by "U". Thanks to Faried Nawaz. * Copy tweets by "C-". Thanks to Faried Nawaz. * Support for `wget'. The external program `wget' can be used for communicating with Twitter as well as `curl'. You can give priority to `wget' by the below configuration. (setq twittering-connection-type-order '(wget curl native)) * Display of the current connection method on the mode-line. By default, the current connection method is displayed on the mode-line. You can disable it by "(setq twittering-display-connection-method nil)". * Silent retrieval of icons. The default value of `twittering-url-show-status' is changed to nil. So, icons are retrieved silently by default. * New connection methods, `urllib-http' and `urllib-https'. New connection methods are added, which are implemented by using `url' library. The library supports HTTP redirection, but it may be slow and unstable. This method is not recommended if you can use other methods. If you give incorrect account information on BASIC authentication or xAuth with this new methods, you will be asked to input account information again. This behavior is a function of the url library, but twittering-mode cannot use account information given on the second try. When you are asked to input it again, cancel it by 'C-g' and do 'M-x twit'. * Redisplaying tweets with idle timer. Twittering-mode waits for Emacs to become idle before it redisplays tweets for time and icon image. Tweets are redisplayed each time Emacs remains idle for a certain time specified by the variable `twittering-timer-interval-for-redisplaying', which is 1 second by default. * Retrieval of icon images by `curl' and `wget'. Icon images can be retrieved by the same connection method as that used for retrieving tweets. The priority of methods is similarly determined by `twittering-connection-type-order'. * Lazy invocation of `convert'. The program `convert' for converting the size of icon images is invoked after Emacs remains idle a certain time. The delay will prevent Emacs from stucking on inputting characters on other buffer. The delay time is specified by the new variable `twittering-url-request-sentinel-delay', which is 1 second by default. * Support for favorites timeline. ":favorites" and ":favorites/USER" are added as new timeline specs. By using the latter, you can read favorites for other users. You can specify a username with completion when you input ":favorites/" for `twittering-visit-timeline' bound to "V" in default. Note that favorites are rendered in order of time when each tweet is posted. This is because it is impossible to retrieve the time when a tweet was favorited. At most, 20 favorites can be retrieved. Backward retrieval of more previous favorites is not supported yet. * Support for new URL shortening services. You can use `bit.ly', `goo.gl', `is.gd' or `j.mp' as URL shortening service by the following. (setq twittering-tinyurl-service 'bit.ly) ;; for bit.ly (setq twittering-tinyurl-service 'goo.gl) ;; for goo.gl (setq twittering-tinyurl-service 'is.gd) ;; for is.gd (setq twittering-tinyurl-service 'j.mp) ;; for j.mp To use `bit.ly' or `j.mp', you need to configure `twittering-bitly-login' and `twittering-bitly-api-key' according to your account as follows. (setq twittering-bitly-login "YOUR-LOGIN-NAME") (setq twittering-bitly-api-key "YOUR-API-KEY") Thanks to Michael Kohl and Lars Gregori. * Change of the format specifiers, "%c", "%C", "%@", for official ReTweet. `created_at' for official ReTweet means when the original tweet was posted instead of when it was retweeted. * Function to report a user as a spammer. The function `twittering-block-and-report-as-spammer' is added. By invoking the function on a tweet, you can block its author and report him or her as a spammer. * Function to block a user. The function `twittering-block' is added. By invoking the function on a tweet, you can block its author. * Support for persistent icon storage. By "(setq twittering-use-icon-storage t)", you can save retrieved and resized icon images into a persistent storage, which is disabled in default. On next and later invocation, twittering-mode can display icons faster because the storage reduces time required to retrieve and resize images. In default, recently rendered 500 icons are stored at most. You can change the limit by the variable `twittering-icon-storage-limit'. To store all icons, configure the variable as nil. The default storage file is `~/.twittering-mode-icons.gz'. You can change it by changing `twittering-icon-storage-file'. Note that icon images in the storage generated on a certain version of Emacs may be unavailable on another version of Emacs. * New format specifier "%RT{...}". For `twittering-status-format', the new format specifier "%RT{...}" is added, which is rendered only when the tweet is an official ReTweet. In the brace, you can use any format specifiers, which are rendered with the information of the retweet itself instead of the retweeted original tweet. For example, "%RT{%s}" means who retweeted the tweet. * Cancel of official ReTweets. If an official ReTweet has been posted by yourself, you can cancel it by 'C-cD', which is the same way of deleting a tweet. * Completion of lists to which a specific user subscribes. You can visit a list to which a specific user subscribes by 'C-uL'. Thanks to Naohiro Aota. * Edit skeleton. Edit skeleton is a dynamic template system on posting a tweet. You can define an "edit skeleton", which specifies what string is automatically inserted as a footer, header or others before editing a tweet. `twittering-edit-skeleton-alist' is the alist of edit skeletons. For further details, see docstring of `twittering-edit-skeleton-alist'. The following edit skeletons are pre-defined; none: insert nothing, footer: insert `twittering-edit-skeleton-footer' as a footer, footer-only-normal: insert `twittering-edit-skeleton-footer' as a footer only when the tweet being edited is a normal tweet, not a reply or direct message, inherit-hashtags: insert hashtags extracted from the replied tweet, inherit-mentions: insert mentions extracted from the replied tweet, inherit-any: insert hashtags and mentions extracted from the replied tweet. You can switch the current edit skeleton by invoking `twittering-switch-edit-skeleton'. The footer string, `twittering-edit-skeleton-footer', can be changed by invoking `twittering-edit-skeleton-change-footer'. * Variable of fallback image format. You can change the fallback format of images by changing the variable `twittering-fallback-image-format'. The default format is XPM. Images which Emacs does not supports are displayed by converting them into the fallback format. By the following configuration, you may avoid strange behaviors when displaying XPM images on NTEmacs. Thanks to Silver Chariot. (setq twittering-fallback-image-format 'png) ### Bug fixes * Support for the url library included in Emacs 23 and later. * Fix of options of `curl' for POST with an empty body. * Fix of retweeting a retweet. * Fix of a race condition on abnormal exit of a process for verification. * Fix of replying to tweets displayed as replied tweets. Thanks to Naohiro Aota. * Fix of rendering the format specifier "%L". The specifier "%L" is correctly rendered with a preceding whitespace. Thanks to Tom X. Tobin. * Fix of repeatedly registering a sentinel for retrieving an image. 1.0.0: 2010-06-05 ------------------ ### Important notice #### Posting tweets with minibuffer is obsolete now. There's two way to edit and post tweets in twittering-mode: with minibuffer (existing way), and with pop-up buffer (new feature!). You can choose it by setting the variable `twittering-update-status-function`. Currently its default value is the new way, `twittering-update-status-from-pop-up-buffer`. If you want to post from minibuffer, set the variable value to `twittering-update-status-from-minibuffer`. The new feature, pop-up buffer, has several advantages over the existing way. * Not conflicting with input methods. * Much less risk of posting halfway typed tweets by error. * Visual assertion of length of tweets. ### Improvements * Introduction of a concept 'timeline spec'. * Pop-up buffer to edit and post tweets. * Auto proxy setup with environment variables (http_proxy, HTTP_PROXY) * Support for official ReTweet. * Added some format specifiers of tweets. * Support for recursive format specifiers such as "%FILL{%FACE[bold]{%C{%m/%d}}: %T}". * Support for user-defined prefix on filling by "%FILL[prefix]{...}". * Displaying image files without temporary files. * Support multiple buffers, where their name is derived from timeline spec. * Multiple initial timelines by setting a list of timeline spec strings to the variable `twittering-initial-timeline-spec-string'. * Toggle automatic retrieval of the timeline by pressing 'a'. * Improved compatibility with global-font-lock mode. * Unread statuses notifier on mode-line (experimental). * Switching timeline buffers by pressing 'f' or 'b'. * Graphical indicators for SSL and ACTIVE/INACTIVE state on mode-line. * Asynchronous retrieval of icon images. * Deleting a tweet by inputting 'C-cD'. * HTTPS connection using `tls' library working with an external command `gnutls' or `openssl' instead of `curl'. * Individual proxy configurations for HTTP and HTTPS. If `twittering-proxy-server' and `twittering-proxy-port' are non-nil, they have priority over the other variables `twittering-http-proxy-*' and `twittering-https-proxy-*'. To use individual proxies for HTTP and HTTPS, you must keep the prior variables (`twittering-proxy-server' and `twittering-proxy-port') nil. * Silent retrieval of icon images. You can enable silent retrieval by "(setq twittering-url-show-status nil)". * Authentication via OAuth. It requires a consumer information registered with Twitter and an external WWW browser to authorize a request token. Additionally, for SSL, it requires an external command `curl' or another command included in the variable `tls-program', which may be `openssl' or `gnutls-cli'. (Caution: Neither `openssl' nor `gnutls-cli' support SSL via proxy.) You can disable SSL for OAuth by "(setq twittering-oauth-use-ssl nil)". You can enable OAuth by "(setq twittering-auth-method 'oauth)". If `twittering-oauth-invoke-browser' is non-nil, twittering-mode automatically opens a browser on authorization. ### Bug fixes * Avoid SSL certificate error by embedding CA cert in code. * twittering-cert-file * twittering-ensure-ca-cert * Fix URI (percent) encoding (thanks to IMAI Toshiyuki). * twittering-url-reserved-p * twittering-percent-encode * Improved portability. * twittering-completing-read * And lots of minor fixes ### Thanks to * Alberto Garcia * IMAI Toshiyuki 0.9.0: 2009-12-29 ------------------- ### Improvements * Moved to GitHub. * Brand new web site in English and Japanese. * Secure sessions via HTTPS if 'cURL' is available. * Lists support. * Follow/remove support. * Favorite/unfavorite support. * Hash tag support. * Direct message support. * On-the-spot TinyURL-ize(tinyurl or to.ly). * On-the-fly tweet length check. * ReTweet format string. * Remembers visited user names and tweets. * Parameterized the number of tweets retrieved at a time. * Walk through items(username, URL, etc) by TAB. * Image type discriminant with 'file' program if available. * More descriptive error messages on minibuffer. * Do not discard old timeline data as possible. * Suspend by hitting 'q'. * Image file resize with 'convert' program(imagemagick) if available. * Unit test framework was introduced. * Support 'Proxy-connection: Keep-Alive'. * Flexible format string function (twittering-format-string). * Refactored 'twittering-format-status' by twitterint-format-string. * More efficient HTTP response processing. ### Bug fixes * URL cannot not be opened by mouse-click or Enter. * Don't set the original status ID when retweeting. * Wrong regexp for searching URL in status text. * Username extraction from status text. * Update mode-line immediately. * Use a temporary buffer for each HTTP session. * Use MD5 hash to distinguish image files with the same name. * Check whether temp buffers are alive in sentinels before killing them. * And some typos. ### Thanks to * Alberto Garcia * Jaemok Jeong * Kouhei Sutou * Naohiro Aota * Satoshi Yatagawa * Tadashi MATSUO * Thomas Danckaert * Tsuyoshi CHO * IMAI Toshiyuki twittering-mode-3.1.0/NEWS.ja0000664000175000017500000012412612772521564015564 0ustar tadashitadashi NEWS -- twittering-modeã®ã‚ゆ㿠================================= HEAD: XXXX-XX-XX ------------------ ### é‡è¦ãªãŠçŸ¥ã‚‰ã› ### 改良 ### ãƒã‚°ä¿®æ­£ 3.1.0: 2016-09-28 ------------------ ### é‡è¦ãªãŠçŸ¥ã‚‰ã› * å…¬å¼ReTweetã«å¯¾ã™ã‚‹å…¬å¼ReTweet å…¬å¼ReTweet上ã§é–¢æ•°`twittering-native-retweet'(デフォルトã§ã¯"C-u C-c C-m"ã«bindã•れã¦ã„ã¾ã™)を実行ã—ãŸå ´åˆã«ã€ãã®å…¬å¼ReTweetã«å¯¾ã™ã‚‹ å…¬å¼ReTweetを投稿ã™ã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã—ãŸã€‚以å‰ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§ã¯ã€å…¬å¼ ReTweetãã®ã‚‚ã®ã§ã¯ãªãã€ReTweetã•れãŸã‚ªãƒªã‚¸ãƒŠãƒ«ã®tweetã«å¯¾ã™ã‚‹å…¬å¼ ReTweetを投稿ã—ã¦ã„ã¾ã—ãŸã€‚ã“れã¯å¯¾è±¡ReTweetを投稿ã—ã¦ã„ãŸãƒ¦ãƒ¼ã‚¶ã«ã€ ã•らã«ReTweetãŒè¡Œã‚れãŸã“ã¨ã®é€šçŸ¥ãŒTwitterã‹ã‚‰æ­£ã—ãé€ä¿¡ã•れるよã†ã« ã™ã‚‹ãŸã‚ã®å¤‰æ›´ã§ã™ã€‚ * デフォルトã®tweetæç”»æ›¸å¼ã®å¤‰æ›´ 変数`twittering-status-format'ã®ãƒ‡ãƒ•ォルト値ãŒå¤‰æ›´ã•れã€tweetä¸­ã®æ”¹ 行ãŒãã®ã¾ã¾æç”»ã•れã€ã¾ãŸå¼•用先tweetãŒæç”»ã•れるよã†ã«ãªã‚Šã¾ã—ãŸã€‚ 以å‰ã®æç”»å½¢å¼ã«æˆ»ã™ã«ã¯å¤‰æ•°`twittering-status-format'ã®å€¤ã‚’ "%i %s, %@:\n%FILL[ ]{%T // from %f%L%r%R}\n "ã«è¨­å®šã—ã¦ãã ã•ã„。 ### 改良 * å…¨ã¦ã®VeriSign Root CA証明書を内蔵 https://www.symantec.com/page.jsp?id=roots ã§æä¾›ã•れã¦ã„る有効㪠Root CA証明書を全ã¦`twittering-mode.el'ã«å†…蔵ã—ã¾ã—ãŸã€‚ * 140文字以上ã®direct messageã«å¯¾å¿œ * 引用先tweetã‚’æç”»ã™ã‚‹æ–°ã—ã„æ›¸å¼æŒ‡å®šå­"%QT{...}" `twittering-status-format'ã§ä½¿ãˆã‚‹æ›¸å¼æŒ‡å®šå­ã¨ã—ã¦å¼•用先tweetã‚’æç”» ã™ã‚‹"%QT{...}"を追加ã—ã¾ã—ãŸã€‚括弧ã®ä¸­ã«ã¯ä»»æ„ã®æ–‡å­—åˆ—ã¨æ›¸å¼æŒ‡å®šå­ã‚’ 入れるã“ã¨ãŒã§ãã€æ‹¬å¼§å†…ã®æ›¸å¼æŒ‡å®šå­ã¯å¼•用ã•れãŸtweetã®æƒ…報を使ã£ã¦ æç”»ã•れã¾ã™ã€‚例ãˆã°ã€"%QT{%s}"ã¯å¼•用ã•れãŸtweetã®æŠ•ç¨¿è€…ã® screen_nameã¨ãªã‚Šã¾ã™ã€‚"%QT{...}"ã¯å¯¾è±¡ã¨ãªã‚‹tweetãŒåˆ¥ã®tweetを引用 ã—ã¦ã„ã‚‹ã¨ãã ã‘æç”»ã•れã¾ã™ã€‚ 引用ã•れãŸtweet自体を表示ã—ãŸã„å ´åˆã¯ãã®tweetã®ã‚¿ã‚¤ãƒ ã‚¹ã‚¿ãƒ³ãƒ—上㧠`twittering-other-user-timeline'(デフォルトã§ã¯"v"ã«bindã•れã¦ã„ã¾ã™)ã‚’ 実行ã—ã¦ãã ã•ã„。 * 投稿tweet内ã®"&"ã‚’æ­£ã—ãæç”» 投稿ã—ãŸtweetãŒ"&"ã®æ–‡å­—ã‚’å«ã‚“ã§ã„ã‚‹å ´åˆã€å¯¾å¿œã™ã‚‹JSONオブジェクト内 ã§ã¯"&"ã®ã‚ˆã†ã«ç¬¦å·åŒ–ã•れã¦ã—ã¾ã„ã¾ã™ã€‚ç¾åœ¨ã®ç‰ˆã§ã¯ã“れを正ã—ã "&"ã®ã‚ˆã†ã«æç”»ã™ã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã—ãŸã€‚"&"ã‚’å«ã‚€tweetを投稿ã™ã‚‹éš›ã€ Twitterサーãƒã®ã‚ˆã分ã‹ã‚‰ãªã„挙動ã®ãŸã‚投稿å¯èƒ½ãªé•·ã•ã§ã‚ã‚‹ã‹ã‚’正㗠ã計算ã§ããªã„å ´åˆãŒã‚りã¾ã™ã®ã§æ³¨æ„ã—ã¦ãã ã•ã„。具体的ã«ã¯ä¸‹è¨˜ã®ã‚ˆ ã†ãªæŒ¯èˆžã„ãŒç¢ºèªã•れã¦ã„ã¾ã™ã€‚ - 120個ã®"&"ã‹ã‚‰ãªã‚‹tweetã¯æŠ•ç¨¿å¯èƒ½ã§ã™ãŒã€121個ã®ã‚‚ã®ã‚’投稿ã—よã†ã¨ ã™ã‚‹ã¨"Status is over 140 characters."ã®ã‚¨ãƒ©ãƒ¼ãŒèµ·ã“り投稿ã§ãã¾ã› ん。 - 115個ã®"&"ã¨25å€‹ã®æ•°å­—ã‹ã‚‰ãªã‚‹tweetã¯æŠ•ç¨¿å¯èƒ½ã§ã™ãŒã€116個ã®"&"㨠24å€‹ã®æ•°å­—ã‹ã‚‰ãªã‚‹tweetã¯"Status is over 140 characters."ã®ã‚¨ãƒ©ãƒ¼ ãŒèµ·ã“り投稿ã§ãã¾ã›ã‚“。 * 自分自身ã®tweetã®retweet è‡ªåˆ†ãŒæŠ•ç¨¿ã—ãŸtweetã‚’retweetã§ãるよã†ã«ãªã‚Šã¾ã—ãŸã€‚ ### ãƒã‚°ä¿®æ­£ * åŒä¸€ã®timelineã«å¯¾ã—ã¦hookãŒäºŒé‡ã«å®Ÿè¡Œã•れるãƒã‚°ã‚’修正 * å…¬å¼ReTweetã«å¯¾ã™ã‚‹URLを修正 3.0.0: 2013-04-21 ------------------ ### é‡è¦ãªãŠçŸ¥ã‚‰ã› * æš—é»™ã«ç½²åを付加ã™ã‚‹æ©Ÿèƒ½ã®å»ƒæ­¢ 関数`twittering-sign-string-function'ã¨å¤‰æ•° `twittering-sign-simple-string'ã®æ©Ÿèƒ½ã¯å»ƒæ­¢ã•れã¾ã—ãŸã€‚åŒæ§˜ã®æ©Ÿèƒ½ã¯ `edit skeleton'ã§è¨­å®šã§ãã¾ã™ã®ã§ã€ã“ã¡ã‚‰ã‚’使ã£ã¦ãã ã•ã„。 例ãˆã°ä»¥å‰ã¾ã§ã®è¨­å®š (setq twittering-sign-simple-string "footer") ã¯ã€ä»¥ä¸‹ã®è¨­å®šã§ç½®ãæ›ãˆã‚‰ã‚Œã¾ã™ã€‚ (setq twittering-edit-skeleton-footer " [footer]") (setq twittering-edit-skeleton 'footer) * 変数`twittering-scroll-mode'ã®å»ƒæ­¢ 変数`twittering-scroll-mode'ã¯å»ƒæ­¢ã•れã¾ã—ãŸã€‚ç¾åœ¨ã®ç‰ˆã¯ã€éŽåŽ»ã®ç‰ˆã§ scroll-modeãŒæœ‰åйã§ã‚ã£ãŸã¨ãã®ã‚ˆã†ã«æŒ¯èˆžã„ã¾ã™ã€‚最新ã®tweetã«è¿½å¾“ã™ ã‚‹ã«ã¯ã€timelineãƒãƒƒãƒ•ã‚¡ã®æœ€æ–°å´ã®ãƒ˜ãƒƒãƒ€ã‚‚ã—ãã¯ãƒ•ッタ上ã«ã‚«ãƒ¼ã‚½ãƒ«ã‚’ ç½®ã„ã¦ãã ã•ã„。 * "C-cD"ã®ä»£æ›¿ã¨ã—ã¦"C-cC-w"ã‚’å°Žå…¥ ã“れã¾ã§ã€"C-cD"ãŒtweet削除用関数'twittering-delete-status'ã«bind㕠れã¦ã„ã¾ã—ãŸã€‚ã—ã‹ã—ã“ã®ã‚­ãƒ¼ã¯Emacsã®Key Binding Conventionsã«å‰‡ã£ã¦ ã„ã¾ã›ã‚“。ãã“ã§ãã®ä»£æ›¿ã¨ã—ã¦"C-cC-w"ã‚’åŒé–¢æ•°ã«bindã—ã¾ã—ãŸã€‚"C-cD" も有効ã§ã™ãŒã€"C-cC-w"ã®ä½¿ç”¨ã‚’推奨ã—ã¾ã™ã€‚ ### 改良 * ç¾åœ¨ã®timelineã«å¿œã˜ãŸedit skeleton ç¾åœ¨ã®timelineã«å¿œã˜ãŸedit skeletonを定義ã§ãるよã†ã«ãªã‚Šã¾ã—ãŸã€‚ 詳ã—ãã¯å¤‰æ•°`twittering-edit-skeleton-alist'ã®docstringã‚’å‚ç…§ãã ã• ã„。 ã¾ãŸã€å®šç¾©æ¸ˆã¿edit skeleton `inherit-hashtags'ã¨`inherit-any'ã¯ç¾åœ¨ ã®timelineãŒãƒãƒƒã‚·ãƒ¥ã‚¿ã‚°ã‚’å«ã‚€ã‚ˆã†ãªsearch timelineã§ã‚ã‚‹å ´åˆã«ã€ã ã®ãƒãƒƒã‚·ãƒ¥ã‚¿ã‚°ã‚’自動ã§è¿½åŠ ã™ã‚‹ã‚ˆã†å¤‰æ›´ã•れã¦ã„ã¾ã™ã€‚ * è¶…éŽæ–‡å­—列ã®å¼·èª¿è¡¨ç¤ºç„¡åŠ¹åŒ– 通常ã€`twittering-edit-mode'ã§ã¯140å­—ã‚’è¶…ãˆã‚‹éƒ¨åˆ†ã«overlay `twittering-warning-overlay'を付加ã—ã¦å¼·èª¿è¡¨ç¤ºã™ã‚‹ã‚ˆã†ã«ãªã£ã¦ã„ã¾ã™ã€‚ ã—ã‹ã—環境ã«ã‚ˆã£ã¦ã¯input methodã¨ã“ã®overlayã®æ›´æ–°ã¨ãŒå¹²æ¸‰ã—ã¦å•題 ã‚’èµ·ã“ã™å ´åˆãŒã‚るよã†ã§ã™ã€‚ãã®ã‚ˆã†ãªå ´åˆã€ä¸‹è¨˜ã®è¨­å®šã§overlayã®ä»˜ 加を無効化ã™ã‚Œã°å•題を回é¿ã§ãã‚‹å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚ (setq twittering-disable-overlay-on-too-long-string t) * tweet中ã®URI文字列ã¸ã®ã‚¸ãƒ£ãƒ³ãƒ— tweet中ã®URI文字列ã¸ã‚¸ãƒ£ãƒ³ãƒ—ã™ã‚‹ã‚³ãƒžãƒ³ãƒ‰`twittering-goto-next-uri'〠`twittering-goto-previous-uri'ãŒè¿½åŠ ã•れã¾ã—ãŸã€‚ ã¾ãŸã€æ—§æ¥ã®ã‚³ãƒžãƒ³ãƒ‰`twittering-goto-next-thing'㨠`twittering-goto-previous-thing'ã«C-uã§prefix argumentを与ãˆã‚‹ã¨ tweet中ã®URI文字列ã ã‘を対象ã¨ã—ã¦ã‚¸ãƒ£ãƒ³ãƒ—ã™ã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã—ãŸã€‚ * CA証明書を追加 æ–°ãŸã«Root CA証明書`VeriSign Class 3 Public Primary CA - G2'㨠`GeoTrust Global CA'を内蔵ã—ã¾ã—ãŸã€‚ã“れらã®è¨¼æ˜Žæ›¸ã¯ãれãžã‚Œã€ `api.twitter.com'ã¨`search.twitter.com'ã®ã‚µãƒ¼ãƒèªè¨¼ã§å‚ç…§ã•れã¾ã™ã€‚ 以å‰ã‹ã‚‰å†…蔵ã•れã¦ã„る証明書`Equifax Secure Certificate Authority'㯠URI短縮ã«ç”¨ã„ã‚‹`www.googleapis.com'ã®ã‚µãƒ¼ãƒèªè¨¼ã§ã®ã¿å‚ç…§ã•れるよㆠã«ãªã‚Šã¾ã—ãŸã€‚ * æ–°ãŸãªçŸ­ç¸®URL生æˆã‚µãƒ¼ãƒ“スã«å¯¾å¿œ æ–°ãŸã«`migre.me'ã«å¯¾å¿œã—ã¾ã—ãŸã€‚下記ã®ã‚ˆã†ãªè¨­å®šã§æœ‰åйã«ã§ãã¾ã™ã€‚ (setq twittering-tinyurl-service 'migre.me) ;; for mig.re * 指定ã—ãŸãƒ¦ãƒ¼ã‚¶é–¢é€£ã®retweetを集ã‚ãŸtimelineã«å¯¾å¿œ æ–°ã—ã":retweeted_by_user/USER", ":retweeted_to_user/USER"ã®2種類㮠timelineã«å¯¾å¿œã—ã¾ã—ãŸã€‚å‰è€…ã¯æŒ‡å®šã—ãŸãƒ¦ãƒ¼ã‚¶USERãŒæŠ•ç¨¿ã—ãŸretweetã‚’ 集ã‚ãŸtimelineã§ã€å¾Œè€…ã¯æŒ‡å®šã—ãŸãƒ¦ãƒ¼ã‚¶ã®home timelineã«å±Šãretweetã‚’ 集ã‚ãŸtimelineã§ã™ã€‚ `twittering-visit-timeline'(デフォルトã§ã¯"V"ã«bindã•れã¦ã„ã¾ã™)ã§æŒ‡ 定ã™ã‚‹éš›ã«ã¯":retweeted_by_user/"ã‚‚ã—ãã¯":retweeted_to_user/"ã¨å…¥åŠ› ã—ã¦Enterを入力ã™ã‚‹ã¨ã€ç¶šã‘ã¦è£œå®Œæ©Ÿèƒ½ä»˜ãã§ãƒ¦ãƒ¼ã‚¶åを入力ã§ãã¾ã™ã€‚ * 文字数カウント時ã«t.coã§ã®çŸ­ç¸®ã‚’考慮 tweetを編集ã™ã‚‹éš›ã«ã€t.coã§ã®URI変æ›ã‚’考慮ã—ãŸæ–‡å­—数を表示ã™ã‚‹ã‚ˆã†ã« ãªã‚Šã¾ã—ãŸã€‚変æ›å¾Œã®æ–‡å­—æ•°ã¯help/configuration APIを通ã˜ã¦å®šæœŸçš„ã«æ›´ æ–°ã•れã¾ã™ã€‚ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã®æ›´æ–°é–“éš”ã¯1æ—¥ã§ã™ãŒã€å¤‰æ•° `twittering-service-configuration-update-interval'ã§å¤‰æ›´ã™ã‚‹ã“ã¨ã‚‚ã§ ãã¾ã™ã€‚ * éžASCII文字をå«ã‚€ãƒãƒƒã‚·ãƒ¥ã‚¿ã‚°ã¸ã®ç°¡æ˜“çš„ãªå¯¾å¿œ éžASCII文字をå«ã‚€ãƒãƒƒã‚·ãƒ¥ã‚¿ã‚°ã«ã¤ã„ã¦ã‚‚ã€å¼·èª¿è¡¨ç¤ºã•れるよã†ã«ãªã‚Šã€ `v'ã§ãã®timelineã‚’é–‹ãã“ã¨ãŒã§ãるよã†ã«ãªã‚Šã¾ã—ãŸã€‚ãƒãƒƒã‚·ãƒ¥ã‚¿ã‚°ã® 検出基準ãŒTwitterã®web UIã®ãれã¨ã¯å¤šå°‘ç•°ãªã‚‹ç‚¹ã«æ³¨æ„ã—ã¦ãã ã•ã„。 今ã®ã¨ã“ã‚大ããªå•題ã¯è¦‹ã¤ã‹ã£ã¦ã„ã¾ã›ã‚“ãŒã€å ´åˆã«ã‚ˆã£ã¦ã¯ twittering-mode上ã§ãƒãƒƒã‚·ãƒ¥ã‚¿ã‚°ã¨è¦‹ãªã•れる文字列ãŒTwitterã®web UIã§ ã¯ãƒãƒƒã‚·ãƒ¥ã‚¿ã‚°ã¨ã¯è¦‹ãªã•れãªã„æã‚Œã¯ã‚りã¾ã™ã€‚ * t.coã§çŸ­ç¸®ã•れãŸãƒªãƒ³ã‚¯ã‚’短縮å‰ã®URLã§è¡¨ç¤º Twitterå…¬å¼ã®t.coサービスã§çŸ­ç¸®ã•れãŸãƒªãƒ³ã‚¯ãŒçŸ­ç¸®å‰ã®URLã¨ã—ã¦æç”»ã• ã‚Œã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã—ãŸã€‚但ã—`json.el'ãŒåˆ©ç”¨ä¸å¯ã®å ´åˆã¯search timeline 上ã§ã¯t.coã§ç”Ÿæˆã•れãŸURLãŒãã®ã¾ã¾æç”»ã•れã¾ã™ã€‚ã¾ãŸã€ãƒªãƒ³ã‚¯ä¸Šã§ `twittering-enter'(デフォルトã§ã¯`C-m')を実行ã—ãŸå ´åˆã¯çŸ­ç¸®URL経由㧠開ã‹ã‚Œã¾ã™ * mentionã®ã¿ã‹ã‚‰ãªã‚‹tweetã®æŠ•ç¨¿ ãƒãƒƒãƒ—アップãƒãƒƒãƒ•ã‚¡ã‹ã‚‰ã§ã‚れã°ã€mentionã®ã¿ã‹ã‚‰ãªã‚‹tweetも投稿ã§ã るよã†ã«ãªã‚Šã¾ã—ãŸã€‚ * `revive.el'ã«ã‚ˆã‚‹timelineãƒãƒƒãƒ•ã‚¡ã®å¾©å…ƒ HIROSE Yuujiã•ん作ã®Emacs LISPプログラム`revive.el'ã§timelineãƒãƒƒãƒ•ã‚¡ を復元ã§ãるよã†ã«ãªã‚Šã¾ã—ãŸã€‚設定方法ã«ã¯ä¸‹è¨˜ã®2通りãŒã‚りã¾ã™ã€‚ 1. 手動登録 (add-to-list 'revive:major-mode-command-alist-private '(twittering-mode . twittering-revive:twittering)) (add-to-list 'revive:save-variables-local-private '(twittering-mode twittering-timeline-spec-string)) (require 'revive) 2. 関数を使ã£ã¦ã®è‡ªå‹•登録 (revive.el 2.19用) (require 'revive) (twittering-setup-revive) 上記設定ã§ã€æ‰‹å‹•登録ã®`(add-to-list ...)'ã®éƒ¨åˆ†ã¯`revive.el'ã‚’loadã™ ã‚‹å‰ã«è©•価ã™ã‚‹å¿…è¦ãŒã‚ã‚‹ç‚¹ã«æ³¨æ„ã—ã¦ãã ã•ã„。ã¾ãŸé€†ã«è‡ªå‹•登録ã®å ´åˆ ã¯`revive.el'ã‚’loadã—ãŸå¾Œã§`(twittering-setup-revive)'を評価ã™ã‚‹å¿…è¦ ãŒã‚りã¾ã™ã€‚ ã¾ãŸã€åŒã˜ãHIROSE Yuujiã•ん作ã®Emacs LISPプログラム`windows.el'㯠`revive.el'ã‚’æš—é»™ã«loadã—ã¾ã™ã®ã§ã€`windows.el'ã‚’loadã™ã‚‹ã‚¿ã‚¤ãƒŸãƒ³ã‚° ã«ã‚‚注æ„ã—ã¦ãã ã•ã„。 * `twittering-retweet-format'ç”¨ã®æ–°ã—ã„æ›¸å¼æŒ‡å®šå­"%u" `twittering-retweet-format'ã§æŒ‡å®šã§ãã‚‹æ›¸å¼æŒ‡å®šå­ã¨ã—ã¦"%u"ãŒè¿½åŠ ã• ã‚Œã¾ã—ãŸã€‚ã“れã¯å¼•用ã•れるtweetを指ã™URLã¨ç½®ãæ›ãˆã‚‰ã‚Œã¾ã™ã€‚ * skeletonã«ã‚ˆã‚‹éžå…¬å¼ReTweetã®åˆæœŸæ–‡å­—列設定 éžå…¬å¼ReTweetを編集ã™ã‚‹éš›ã®åˆæœŸæ–‡å­—列を指定ã™ã‚‹å¤‰æ•° `twittering-retweet-format'ã«skeletonを指定ã§ãるよã†ã«ãªã‚Šã¾ã—ãŸã€‚ 文字列ã«åŠ ãˆã¦ç·¨é›†é–‹å§‹æ™‚ã®ã‚«ãƒ¼ã‚½ãƒ«ä½ç½®ã‚‚指定ã§ãã¾ã™ã€‚skeletonã«å«ã¾ れる文字列を下記ã®å¯¾å¿œè¡¨ã«ã‚ˆã£ã¦å¤‰æ›ã—ã¦ã‹ã‚‰ã€é–¢æ•°`skeleton-insert' ã§æŒ¿å…¥ã—ã¾ã™ã€‚ 対応表ã¯ä»¥ä¸‹ã®é€šã‚Šã§ã™ã€‚ %s - 引用ã•れるtweetã®æŠ•ç¨¿è€…ã®screen-name %t - 引用ã•れるtweetã®å†…容 %u - 引用ã•れるtweetを指ã™URL %# - 引用ã•れるtweetã®ID %% - %自身 ã“ã®è¡¨ã¯`twittering-retweet-format'ã«é©ç”¨ã•れるè¦å‰‡ã¨åŒã˜ã§ã™ã€‚ ã“ã®å¤‰æ•°`twittering-retweet-format'ã«ã‚ˆã‚‹åˆæœŸæ–‡å­—åˆ—ã®æŒ¿å…¥å¾Œã«å¤‰æ•° `twittering-edit-skeleton'ã§æŒ‡å®šã•れãŸedit skeletonãŒé©ç”¨ã•れる点㫠注æ„ã—ã¦ãã ã•ã„。 * edit skeleton用ã«éžå…¬å¼ReTweetを示ã™ã‚·ãƒ³ãƒœãƒ«ã‚’追加 edit skeletonã«ãŠã‘る編集中tweetã®ç¨®åˆ¥ã‚’表ç¾ã™ã‚‹ã‚·ãƒ³ãƒœãƒ«ã« `organic-retweet'ãŒè¿½åŠ ã•れã¾ã—ãŸã€‚éžå…¬å¼ReTweetã«ã®ã¿é©ç”¨ã•れるedit skeletonを定義ã§ãã¾ã™ã€‚但ã—ã€ç¾åœ¨ã®å®Ÿè£…ã§ã¯edit skeletonå´ã‹ã‚‰éžå…¬ å¼ReTweetã•れよã†ã¨ã—ã¦ã„ã‚‹tweetã®å†…容をå‚ç…§ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 * éžASCII文字をå«ã‚€ãƒªã‚¹ãƒˆåã«å¯¾å¿œ * search timeline上ã§ã®è¿”ä¿¡å…ˆtweetã®è¡¨ç¤º `json.el'ãŒä½¿ç”¨å¯èƒ½ãªå ´åˆã«ã¯ã€search timelineã«ãŠã„ã¦ã‚‚返信先tweet ã®IDãŒå–å¾—ã§ãるよã†ã«ãªã‚Šã¾ã—ãŸã€‚`json.el'ãŒä½¿ç”¨å¯èƒ½ã§ã‚れã°é–¢æ•° `twittering-toggle-show-replied-statuses'(デフォルトã§ã¯"r"ã«bind㕠れã¦ã„ã¾ã™)を呼ã³å‡ºã™ã“ã¨ã§è¿”ä¿¡å…ˆtweetを表示ã§ãã¾ã™ã€‚ * ヘッダã¨ãƒ•ッタã®è¡¨ç¤º timelineãƒãƒƒãƒ•ã‚¡ã«ãƒ˜ãƒƒãƒ€ã¨ãƒ•ッタãŒè¡¨ç¤ºã•れるよã†ã«ãªã‚Šã¾ã—ãŸã€‚ã“れら ã¯tweetã¨ã¯ç‹¬ç«‹ã®ç‰¹åˆ¥ãªè¡Œã¨ã—ã¦æç”»ã•れã¾ã™ã€‚ヘッダやフッタ上ã§Enter キーを押ã™(ã‚‚ã—ãã¯`twittering-enter'を実行ã™ã‚‹)ã¨ã€ãれãŒtimelineã® æ™‚ç³»åˆ—ã§æœ€æ–°ã®å´ã‹éŽåŽ»ã®å´ã‹ã«å¿œã˜ã¦tweetã‚’å–å¾—ã—ã¦æç”»ã—ã¾ã™ã€‚ ã¾ãŸã€ãƒ˜ãƒƒãƒ€ã¨ãƒ•ッタã®å†…ã®æœ€æ–°å´ã«ã‚«ãƒ¼ã‚½ãƒ«ã‚’ç½®ã„ã¦ãŠãã¨ã€å¸¸ã«ã‚«ãƒ¼ã‚½ ル行ã®è¿‘ãã«æœ€æ–°tweetã‚’æç”»ã™ã‚‹ã‚ˆã†ã«ã§ãã¾ã™ã€‚ ヘッダã€ãƒ•ッタã¨ã—ã¦è¡¨ç¤ºã•れる文字列ã¯ã€`twittering-timeline-header'〠`twittering-timeline-footer'ã¨ã„ã†å¤‰æ•°ã§å¤‰æ›´ã§ãã¾ã™ã€‚ã¾ãŸã€è¡¨ç¤ºã™ã‚‹ éš›ã®faceã¯`twittering-timeline-header-face'㨠`twittering-timeline-footer-face'ã§å¤‰æ›´ã§ãã¾ã™ã€‚ * exclude-if timelineã«å¯¾å¿œ æ–°ã—ã":exclude-if/FUNC/SPEC"ã¨ã„ã†timelineã«å¯¾å¿œã—ã¾ã—ãŸã€‚ã“ã® timelineã¯SPECã§è¡¨ã•れるもã®ã¨ã»ã¼åŒã˜ã§ã™ãŒã€é–¢æ•°FUNCãŒnon-nilã‚’è¿” ã™ã‚ˆã†ãªtweetã¯é™¤å¤–ã•れã¦ã„る点ãŒç•°ãªã‚Šã¾ã™ã€‚FUNCã¯ã²ã¨ã¤ã®tweetã«å¯¾ 応ã—ãŸé€£æƒ³ãƒªã‚¹ãƒˆã‚’ã²ã¨ã¤å—ã‘å–る関数ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“。FUNCã¨ã—㦠ã¯Î»å¼ã‚‚ã—ãã¯é–¢æ•°ã«å¯¾å¿œã™ã‚‹ã‚·ãƒ³ãƒœãƒ«ãŒæŒ‡å®šã§ãã¾ã™ã€‚但ã—ã‚·ãƒ³ãƒœãƒ«ã§æŒ‡ 定ã™ã‚‹å ´åˆã€åå‰ã«"("ã‚„"/"ã‚’å«ã‚€ã‚‚ã®ã¯æŒ‡å®šã§ãã¾ã›ã‚“。SPECã«ã¯ä»»æ„ã® timeline specを指定ã§ãã¾ã™ã€‚例ãˆã°ã€home timelineã‹ã‚‰"WORD"ã‚’å«ã‚€ tweetを除外ã—ãŸtimelineã¯ä¸‹è¨˜ã®timeline specã§æŒ‡å®šã§ãã¾ã™ã€‚ ":exclude-if/(lambda (tweet) (string-match \"WORD\" (cdr (assq 'text tweet))))/:home" * merge timelineã«å¯¾å¿œ æ–°ã—ã"(SPEC1+SPEC2)"ã‚„"(SPEC1+SPEC2+SPEC3)"ã¨ã„ã£ãŸå½¢å¼ã®timeline㫠対応ã—ã¾ã—ãŸã€‚merge timelineã¯æŒ‡å®šã—ãŸtimelineã®tweetã‚’å…¨ã¦å«ã‚€ timelineã§ã™ã€‚ä»»æ„ã®timeline specã‚’æ§‹æˆè¦ç´ ã«ã§ãã¾ã™ã€‚例ãˆã°ã€ "(:direct_messages+:direct_messages_sent)"ã¨ã„ã†timeline specを使㈠ã°ã“れã¾ã§ã«é€ã£ãŸã‚Šå—ã‘å–ã£ãŸã‚Šã—ãŸdirect messageã®å…¨ã¦ã‚’ã²ã¨ã¤ã®ãƒãƒƒ ファã«è¡¨ç¤ºã§ãã¾ã™ã€‚ * tweetæç”»æ™‚ã«å®Ÿè¡Œã•れる新ã—ã„hookã®è¿½åŠ  æ–°ã—ã„hook変数`twittering-new-tweets-rendered-hook'を追加ã—ã¾ã—ãŸã€‚ ã“ã®hookã¯å®Ÿéš›ã«æ–°ã—ã„tweetã‚’æç”»ã—ãŸã¨ãã«å®Ÿè¡Œã•れã¾ã™ã€‚以å‰ã«å–å¾— ã—ãŸtweetã‚’å†æç”»ã™ã‚‹éš›ã«ã¯å®Ÿè¡Œã•れã¾ã›ã‚“。既存ã®hook変数 `twittering-new-tweets-hook'ã¯tweetã®å–å¾—ã«æˆåŠŸã™ã‚‹ãŸã³ã«å®Ÿè¡Œã•れる ã®ã§ã€exclude-if timelineã‚„merge timelineã®ã‚ˆã†ãªè¤‡åˆtimelineã«å«ã¾ れる実際ã«ã¯æç”»ã•れãªã„tweetã«ã¤ã„ã¦ã‚‚hookを実行ã—ã¾ã™ã€‚æ–°ã—ã„hook ã¯è¤‡åˆtimelineã«ã¤ã„ã¦ã‚‚ã†ã¾ã動作ã—ã¾ã™ã€‚ hook内ã§ã¯ã€`twittering-rendered-new-tweets'ã¨ã„ã†å¤‰æ•°ã§æç”»ã•れ㟠tweetã®ãƒªã‚¹ãƒˆã‚’å‚ç…§ã§ãã¾ã™ã€‚ä»–ã«ã‚‚æç”»ã•れãŸtimelineを表ã™timeline specã¨timeline spec文字列を`twittering-rendered-new-tweets-spec'㨠`twittering-rendered-new-tweets-spec-string'ã¨ã„ã†å¤‰æ•°ã§å‚ç…§ã§ãã¾ã™ã€‚ 詳細ã¯`twittering-new-tweets-rendered-hook'ã®docstringã‚’å‚ç…§ã—ã¦ãã  ã•ã„。 * å¤§åŸŸå¤‰æ•°åˆæœŸåŒ–時ã«å®Ÿè¡Œã•れる新ã—ã„hookã®è¿½åŠ  æ–°ã—ã„hook変数`twittering-mode-init-hook'を追加ã—ã¾ã—ãŸã€‚ã“ã®hookã¯ å¤§åŸŸå¤‰æ•°ã‚’åˆæœŸåŒ–ã—ãŸå¾Œã«å®Ÿè¡Œã•れã¾ã™ã€‚twittering-mode用ã®bufferを作 æˆã™ã‚‹ãŸã³ã«å®Ÿè¡Œã•れる`twittering-mode-hook'ã¨ã¯ç•°ãªã‚Šã€æ–°ã—ã„hook㯠一度ã—ã‹å®Ÿè¡Œã•れã¾ã›ã‚“。 * 編集ãƒãƒƒãƒ•ァ上ã§ã®tweet種別ã®è¡¨ç¤º 編集中ã®tweetã«ã¤ã„ã¦ã®æƒ…å ±ãŒç·¨é›†ãƒãƒƒãƒ•ã‚¡ã®å…ˆé ­ã«è¡¨ç¤ºã•れるよã†ã«ãª りã¾ã—ãŸã€‚編集中ã®tweetãŒreplyãªã®ã‹ã€direct messageãªã®ã‹ã€ã‚ã‚‹ã„㯠通常ã®tweetãªã®ã‹ãŒç¢ºèªã§ãã¾ã™ã€‚replyå…ˆã®tweet内容ã®ã‚³ãƒ”ーもã§ãã¾ ã™ã€‚ * 編集中ã®tweetã‚’replyã¨ã—ã¦é€ã‚‹ã‹ã©ã†ã‹ã®åˆ‡ã‚Šæ›¿ãˆ 編集中ã®tweetã‚’replyã¨ã—ã¦é€ã‚‹ã‹ã©ã†ã‹ã‚’編集ãƒãƒƒãƒ•ァ上ã§åˆ‡ã‚Šæ›¿ãˆã‚‰ã‚Œ るよã†ã«ãªã‚Šã¾ã—ãŸã€‚関数`twittering-edit-toggle-reply'(デフォルトã§ã¯ "C-c C-r"ã«bindã•れã¦ã„ã¾ã™)を呼ã¶ãŸã³ã«replyã¨ã—ã¦é€ã‚‹ã‹ã©ã†ã‹ãŒåˆ‡ り替ã‚りã¾ã™ã€‚ * exclude-re timelineã«å¯¾å¿œ æ–°ã—ã":exclude-re/REGEXP/SPEC"ã¨ã„ã†timelineã«å¯¾å¿œã—ã¾ã—ãŸã€‚ã“ã® timelineã¯SPECã§è¡¨ã•れるもã®ã¨ã»ã¼åŒã˜ã§ã™ãŒã€æ­£è¦è¡¨ç¾REGEXPã«ãƒžãƒƒãƒ ã™ã‚‹ã‚ˆã†ãªtweetã¯é™¤å¤–ã•れã¦ã„る点ãŒç•°ãªã‚Šã¾ã™ã€‚REGEXP内㧠/ を指定㙠る際㯠\ ã§ã‚¨ã‚¹ã‚±ãƒ¼ãƒ—ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚例ãˆã°ã€Emacsã®æ–‡å­—列リテラ ル":exclude-re/\\//:home"ã§è¡¨ã•れるtimelineã§ã¯ã€ / ã‚’å«ã‚€tweetãŒé™¤ 外ã•れã¦ã„ã¾ã™ã€‚ * replyã®ç³»åˆ—ã®é€æ¬¡å–å¾— æ–°ã—ã„関数`twittering-toggle-or-retrieve-replied-statuses'(デフォル トã§ã¯"R"ã«bindã•れã¦ã„ã¾ã™)を使ã£ã¦ã€replyã‚’é¡ã£ã¦å–å¾—ã§ãるよã†ã« ãªã‚Šã¾ã—ãŸã€‚ã“ã®é–¢æ•°ã®å‹•作ã¯ä¸‹è¨˜ã®é€šã‚Šã§ã™ã€‚ - カーソルãŒreplyã€ã‚‚ã—ãã¯å±•開表示ã•れãŸreplyå…ˆã®ã„ãšã‚Œã‹ã‚’指ã—ã¦ã„ ã¦ã€ãã®replyã®ç³»åˆ—ã®ä¸€éƒ¨ãŒã¾ã è¡¨ç¤ºã•れã¦ã„ãªã„å ´åˆã€ãã®reply系列 ã‚’å¯èƒ½ãªé™ã‚Šè¡¨ç¤ºã—ã¾ã™ã€‚reply系列内ã®ã„ãã¤ã‹ã®tweetãŒæœªå–å¾—ã®å ´åˆ ã«ã¯ã€ãã®å†…ã®æœ€æ–°ã®ã‚‚ã®ã‚’å–å¾—ã—ã€è¡¨ç¤ºã—ã¾ã™ã€‚ - カーソルãŒreplyã€ã‚‚ã—ãã¯å±•開表示ã•れãŸreplyå…ˆã®ã„ãšã‚Œã‹ã‚’指ã—ã¦ã„ ã¦ã€ãã®replyã®ç³»åˆ—ãŒå…¨ã¦å±•開表示ã•れã¦ã„ã‚‹å ´åˆã€å±•開表示をã¨ã‚Šã‚„ ã‚ã¾ã™ã€‚ - カーソルãŒreply系列内ã®tweetを指ã—ã¦ã„ãªã„å ´åˆã€ä½•ã‚‚ã—ã¾ã›ã‚“。 * 編集ãƒãƒƒãƒ•ã‚¡ç”¨ã‚’é–‹ãæ–¹æ³•ã®è¨­å®š æ–°ãŸã«å¤‰æ•°`twittering-pop-to-buffer-function'を追加ã—ã¾ã—ãŸã€‚ã“ã®å¤‰ æ•°ã¯ç·¨é›†ãƒãƒƒãƒ•ã‚¡ã‚’é–‹ãæ–¹æ³•を指定ã™ã‚‹ã‚‚ã®ã§ã™ã€‚デフォルトã®å€¤ã¯é–¢æ•° `twittering-pop-to-buffer-in-bottom-largest-window'ã¨ãªã£ã¦ã„ã¾ã™ã€‚ ã“ã®é–¢æ•°ã¯ç¾åœ¨ã®ãƒ•ãƒ¬ãƒ¼ãƒ å†…ã§æœ€ä¸‹æ®µã«ã‚るウィンドウã®å†…ã€é¢ç©æœ€å¤§ã®ã‚‚ ã®ã‚’分割ã™ã‚‹ã“ã¨ã§ç·¨é›†ãƒãƒƒãƒ•ァ用ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’確ä¿ã—ã¾ã™ã€‚ä»–ã«ã‚‚ã€é–¢ æ•°`twittering-pop-to-buffer-in-current-window'を指定ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ ã™ã€‚ã“ã®é–¢æ•°ã¯ç¾åœ¨ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’分割ã—ã¦ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’確ä¿ã—ã¾ã™ã€‚ * single tweet timelineã«å¯¾å¿œ æ–°ã—ã":single/ID"ã¨ã„ã†timelineã«å¯¾å¿œã—ã¾ã—ãŸã€‚ã“ã®timelineã¯ID㧠指定ã•れãŸtweetã®ã¿ã‹ã‚‰ãªã‚‹timelineã§ã™ã€‚éžå¸¸ã«å¤ã„tweetç­‰ã«ã‚¢ã‚¯ã‚»ã‚¹ ã™ã‚‹ã®ã«åˆ©ç”¨ã§ãã¾ã™ã€‚ * tweetã«å«ã¾ã‚Œã‚‹URLã‹ã‚‰ã®single tweet timelineå–å¾— 特定ã®tweetを指ã™URL上ã§é–¢æ•°`twittering-other-user-timeline'を呼ã¶ã“ ã¨ã§ã€ãã®tweetã«å¯¾å¿œã—ãŸsingle tweet timelineã‚’é–‹ã‘るよã†ã«ãªã‚Šã¾ã— ãŸã€‚ã“ã®é–¢æ•°ã¯ãƒ‡ãƒ•ォルトã§ã¯"v"ã«bindã•れã¦ã„ã¾ã™ã€‚ * 特定日時以å‰ã®tweetã‚’å–å¾—ã™ã‚‹ã‚³ãƒžãƒ³ãƒ‰ã‚’追加 ç¾åœ¨ã®timelineã®ã€æŒ‡å®šã—ãŸæ—¥æ™‚以å‰ã®tweetã‚’å–å¾—ã§ãã‚‹æ–°ã—ã„コマンド `twittering-get-tweets-before'ãŒè¿½åŠ ã•れã¾ã—ãŸã€‚ * favorites timelineã§éŽåŽ»ã®tweetã®é¡ã£ã¦å–å¾—ã™ã‚‹æ©Ÿèƒ½ã‚’追加 * timelineã”ã¨ã«ç•°ãªã‚‹å–å¾—é–“éš” æ–°ã—ã„変数`twittering-relative-retrieval-interval-alist'ã§ã€timeline ã”ã¨ã«å–得間隔を変更ã§ãるよã†ã«ãªã‚Šã¾ã—ãŸã€‚ã“ã®å¤‰æ•°ã¯æ­£è¦è¡¨ç¾ã¨ç›¸å¯¾ é–“éš”ã‹ã‚‰ãªã‚‹é€£æƒ³ãƒªã‚¹ãƒˆã§ã™ã€‚ã“ã®æ­£è¦è¡¨ç¾ã«ãƒžãƒƒãƒã™ã‚‹timelineã¯ã€ `twittering-timer-interval'を「相対間隔ã€å€ã—ãŸé–“éš”ã§æ›´æ–°ã•れるよㆠã«ãªã‚Šã¾ã™ã€‚ * Twitter REST API v1.1ã«å¯¾å¿œ 変数`twittering-service-method'ã®å€¤ã‚’`twitter-api-v1.1'ã«å¤‰æ›´ã—ã¾ã— ãŸã€‚ã“ã®è¨­å®šã§twittering-modeã¯Twitter REST API v1.1を使ã†ã‚ˆã†ã«ãªã‚Š ã¾ã™ã€‚ã“ã®å ´åˆã€SSL接続ã¨JSONè§£æžå™¨ãŒå¿…è¦ã§ã™ã€‚SSL接続ã«ã¯cURL with OpenSSL, GNU Wget with OpenSSL, OpenSSLã¨GnuTLSã®ã„ãšã‚Œã‹ãŒå¿…è¦ã§ã€ ã•らã«JSONè§£æžå™¨ã¨ã—ã¦`json.el'ãŒå¿…è¦ã¨ãªã‚‹ç‚¹ã«æ³¨æ„ã—ã¦ãã ã•ã„。 Emacs22ã¨ãれ以å‰ã®Emacsã§ã¯`json.el'ãŒåŒæ¢±ã•れã¦ã„ã¾ã›ã‚“ã®ã§åˆ¥é€”用 æ„ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ ã¾ãŸã€Twitter REST API v1.1ã§ã¯ã„ãã¤ã‹ã®timelineãŒå»ƒæ­¢ã•れã¦ã„ã¾ã™ã€‚ 廃止ã•れãŸtimelineã«å¯¾å¿œã™ã‚‹timeline spec文字列ã¯":friends", ":replies", ":public", ":retweeted_by_me", ":retweeted_to_me", ":retweeted_by_user/USER", ":retweeted_to_user/USER"ã§ã™ã€‚ ### ãƒã‚°ä¿®æ­£ * èªè¨¼æˆåŠŸãƒ»å¤±æ•—ã«ã¤ã„ã¦ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒè¡¨ç¤ºã•れるよã†ä¿®æ­£ * 利用å¯èƒ½ãªé€šä¿¡æ–¹æ³•(connection method)ã®ç¢ºèªå‡¦ç†ã®ä¿®æ­£ * HMAC-SHA1ã®è¨ˆç®—を修正 以å‰ã®`twittering-hmac-sha1'ã¯ç¾åœ¨ã®coding-systemã«ã‚ˆã£ã¦ã¯é–“é•ã£ãŸ çµæžœã‚’è¿”ã™å ´åˆãŒã‚りã¾ã—ãŸã€‚ã“ã®å•題を修正ã—ã¾ã—ãŸã€‚ * æ•°å­—ã‹ã‚‰ãªã‚‹ãƒ¦ãƒ¼ã‚¶å(screen_name)ã¨ãƒ¦ãƒ¼ã‚¶IDã®æ··åŒã‚’一部修正 他ユーザã®timelineã‚’å–å¾—ã™ã‚‹éš›ã€æ•°å­—ã®ã¿ã‹ã‚‰ãªã‚‹ãƒ¦ãƒ¼ã‚¶åを指定ã™ã‚‹ã¨ ユーザIDã¨æ··åŒã—ã¦ã—ã¾ã†å•題を修正ã—ã¾ã—ãŸã€‚他ユーザã®ã€ŒãŠæ°—ã«å…¥ã‚Šã€ (favorites)ã‚’å–å¾—ã™ã‚‹å ´åˆã«ã‚‚åŒæ§˜ã®å•題ãŒèµ·ã“りã¾ã™ãŒã€ã“ã¡ã‚‰ã¯ä¿®æ­£ ã§ãã¦ã„ã¾ã›ã‚“ã€‚ã€ŒãŠæ°—ã«å…¥ã‚Šã€ã‚’å–å¾—ã™ã‚‹APIã«ãƒ¦ãƒ¼ã‚¶IDã§ã¯ãªãユーザ åを指定ã™ã‚‹ãƒ‘ラメータãŒãªã„ãŸã‚ã§ã™ã€‚ Thanks to Makoto Fujiwara who reported this problem. * tweet編集ãƒãƒƒãƒ•ã‚¡ã‚’é–‹ã„ãŸéš›ã®æ„図ã—ãªã„カーソル移動を解消 `twittering-mode'ã§ç®¡ç†ã•れã¦ã„ãªã„ãƒãƒƒãƒ•ã‚¡ã‹ã‚‰ `twittering-update-status-function'を呼ã³å‡ºã—ã¦ç·¨é›†ãƒãƒƒãƒ•ァを作る㨠元ã®ãƒãƒƒãƒ•ã‚¡ã§ã®ã‚«ãƒ¼ã‚½ãƒ«ãŒä¸å¿…è¦ã«å‹•ã‹ã•れã¦ã—ã¾ã†ãƒã‚°ã‚’解消ã—ã¾ã—ãŸã€‚ Thanks to mofigan who reported this problem. * アイコンä¿å­˜å‡¦ç†ã‚’修正 `twittering-icon-storage-limit'ã‚‚ã—ãã¯`twittering-convert-fix-size' ãŒnilã®å ´åˆã«ã€ã‚¢ã‚¤ã‚³ãƒ³ãŒæ­£ã—ãä¿å­˜ã§ãã¦ã„ãªã‹ã£ãŸã®ã‚’修正ã—ã¾ã—ãŸã€‚ Thanks to HufflepuffBR who reported this problem about the former variable `twittering-icon-storage-limit'. * byte-compile時ã€`load-path'ã«ç„¡æ¡ä»¶ã§ãƒ‘スãŒè¿½åŠ ã•れるå•題を解消 twittering-modeã®repositoryã«å«ã¾ã‚Œã¦ã„るディレクトリ`emacs21', `url-emacs21'ãŒbyte-compile時ã«ç„¡æ¡ä»¶ã§`load-path'ã«åŠ ãˆã‚‰ã‚Œã¦ãŠã‚Šã€ byte-compile時ã«ã„ãã¤ã‹ã®ãƒžã‚¯ãƒ­ãŒEmacs21用ã®å¤ã„定義ã¨ã—ã¦å–り込㾠れã¦ã„ã¾ã—ãŸã€‚å¤ã„定義ã¯22以é™ã®Emacs上ã§ä½¿ã†ã“ã¨ãŒã§ãã¾ã›ã‚“ã®ã§ byte-compileã«ã‚ˆã£ã¦æ­£ã—ã動作ã—ãªã„ファイルãŒç”Ÿæˆã•れる状態ã«ãªã£ã¦ ã„ã¾ã—ãŸã€‚ãã“ã§byte-compile時ã«ã‚‚Emacs 22以é™ã§ã¯ãƒ‘スãŒè¿½åŠ ã•れãªã„ よã†å¤‰æ›´ã—ã¦ã€ã“ã®å•題を解消ã—ã¾ã—ãŸã€‚ Thanks to HKey who has discovered the bug. * カーソル移動ãŒãŠã‹ã—ããªã‚‹å•題を解消 tweetã«å‰²ã‚Šå½“ã¦ãŸtext propertyãŒå¹²æ¸‰ã—ã¦ã€twittering-modeã®buffer内 ã§ã®è«–ç†è¡Œå˜ä½ã®ã‚«ãƒ¼ã‚½ãƒ«ç§»å‹•ãŒãŠã‹ã—ããªã£ã¦ã„ã¾ã—ãŸã€‚ã“ã®å•題を解消 ã—ã¾ã—ãŸã€‚ Thanks to lemit who reported the problem. * bufferã‹ã‚‰tweetを消ã™ã®ã‚’tweet削除APIãŒæˆåŠŸã—ãŸå¾Œã«å¤‰æ›´ bufferã‹ã‚‰tweetを消去ã™ã‚‹ã‚¿ã‚¤ãƒŸãƒ³ã‚°ã‚’`destroy-status' APIãŒæˆåŠŸã—㟠ã¨ã„ã†å¿œç­”ã‚’å—ã‘å–ã£ãŸå¾Œã«å¤‰æ›´ã—ã¾ã—ãŸã€‚APIãŒå¤±æ•—ã«çµ‚ã‚ã£ãŸå ´åˆã€ 対象tweetã¯bufferã«æ®‹ã£ã¦ã„ã‚‹ã®ã§å†åº¦å‰Šé™¤ã‚’試ã¿ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ * search timeline specå†…ã®æ¤œç´¢æ–‡å­—列ã®ã‚¨ã‚¹ã‚±ãƒ¼ãƒ—を修正 * éžåŒæœŸå®Ÿè¡Œã•れる関数ãŒã‚¨ãƒ©ãƒ¼ã‚’èµ·ã“ã—ã¦ã„ãŸã®ã‚’修正 存在ã—ãªã„ユーザã®timelineã‚’å–å¾—ã—よã†ã¨ã™ã‚‹ã¨éžåŒæœŸå®Ÿè¡Œã•れる関数㌠エラーを起ã“ã—ã¦ã—ã¾ã£ã¦ã„ã¾ã—ãŸã®ã§ã€ä¿®æ­£ã—ã¾ã—ãŸã€‚ 2.0.0: 2011-04-22 ------------------ ### é‡è¦ãªãŠçŸ¥ã‚‰ã› ### 改良 * OAuth, xAuthã§å–å¾—ã—ãŸèªè¨¼æ¸ˆã¿access tokenã®æš—å·åŒ–ä¿å­˜ã«å¯¾å¿œ èªè¨¼æ¸ˆã¿access tokenã‚’GnuPGã§æš—å·åŒ–ã—ã¦ä¿å­˜ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ tokenã‚’ä¿å­˜ã—ã¦ãŠã‘ã°ã€æ¬¡å›žä»¥é™ã®èµ·å‹•時ã«OAuthã®ãŸã‚ã®å¤–部 ブラウザ起動やPINå…¥åŠ›ç­‰ã®æ‰‹ç¶šãã¯å¿…è¦ãªããªã‚Šã¾ã™ã€‚代ã‚ã‚Šã«æš—å·åŒ–ã‚’ è§£ããŸã‚ã®passphraseを入力ã—ã¦ãã ã•ã„。 ã“ã®æ©Ÿèƒ½ã¯"(setq twittering-use-master-password t)"ã¨ã™ã‚Œã°æœ‰åŠ¹ã« ãªã‚Šã¾ã™(デフォルトã§ã¯ç„¡åйã§ã™)。 æš—å·åŒ–ã•れãŸç§˜å¯†æƒ…å ±ã¯ãƒ‡ãƒ•ォルトã§ã¯`~/.twittering-mode.gpg'ã«è¨˜éŒ² ã•れã¾ã™ãŒã“ã®ä¿å­˜å…ˆã¯å¤‰æ•°`twittering-private-info-file'ã§å¤‰æ›´å¯èƒ½ ã§ã™ã€‚ ã“ã®æ©Ÿèƒ½ã‚’有効ã«ã™ã‚‹ã«ã¯å¤–部プログラムGnuPGã«åŠ ãˆã¦Emacs LISPプロ グラム`alpaca.el'ã‹EasyPGãŒå¿…è¦ã§ã™ã€‚Emacsã¯23以é™ã§ã‚れã°EasyPGã‚’ åŒæ¢±ã—ã¦ã„ã¾ã™ã®ã§è¿½åŠ ã®Emacs LISPプログラムã¯å¿…è¦ã‚りã¾ã›ã‚“。 `alpaca.el'ã¯version 0.13を想定ã—ã¦ã„ã¾ã™ã®ã§ã€ä»–ã®versionã§ã¯å‹•作㫠å•題ãŒã‚ã‚‹æã‚ŒãŒã‚りã¾ã™ã€‚ * xAuthã®ã‚µãƒãƒ¼ãƒˆ OAuthèªè¨¼ã®ä»–ã«xAuthã«ã‚ˆã‚‹èªè¨¼ã«ã‚‚対応ã—ã¾ã—ãŸã€‚xAuthã«ã‚ˆã‚‹èªè¨¼ã‚’ 有効ã«ã™ã‚‹ã«ã¯"(setq twittering-auth-method 'xauth)"ã®è¨­å®šã‚’追加ã—㦠ãã ã•ã„。 * PINコード入力時ã«ä¸å¿…è¦ãªç©ºç™½ã‚’自動ã§å‰Šé™¤ * èµ·å‹•ã—ãŸå¤–部プロセスã®statusを確èªã—ã¦dead-lockã‚’å›žé¿ * `user', `friends', `mentions', `public'ã§ã‚‚native retweetを表示 * èµ·å‹•ã—ãŸå¤–部プロセスã®ç•°å¸¸çµ‚了を検出 異常終了ã—ãŸãƒ—ロセスã®exit-statusã¯"*Messages*"ãƒãƒƒãƒ•ã‚¡ã§ç¢ºèªã§ãã¾ã™ã€‚ * HTTPS通信ã§ã®ã‚µãƒ¼ãƒèªè¨¼ã®ç„¡åŠ¹åŒ–ã«å¯¾å¿œ サーãƒèªè¨¼ã¯ãƒ‡ãƒ•ォルトã§ã¯æœ‰åйã§ã™ãŒã€ã“れを無効化ã™ã‚‹ã“ã¨ã‚‚ã§ãã‚‹ よã†ã«ãªã‚Šã¾ã—ãŸã€‚"(setq twittering-allow-insecure-server-cert t)"㮠設定ã§HTTPS通信時ã«ã‚‚サーãƒèªè¨¼ã‚’行ã‚ãªããªã‚Šã¾ã™ã€‚ * æœªçŸ¥ã®æ•°å€¤æ–‡å­—å‚照を代替文字ã§ç½®æ› decodeã§ããªã„数値文字å‚ç…§ãŒç¾ã‚ŒãŸã¨ãã«ãã®æ–‡å­—を変数 `twittering-unicode-replacement-char'ã§æŒ‡å®šã•ã‚ŒãŸæ–‡å­—ã«ç½®æ›ã—ã¦è¡¨ç¤º ã—ã¾ã™ã€‚代替文字ã®ãƒ‡ãƒ•ォルトã¯U+FFFDã§ã™ã€‚ * サブディレクトリã«`.nosearch'を追加 å¿…è¦ã®ãªã„サブディレクトリãŒå†å¸°çš„ã«`load-path'ã«è¿½åŠ ã•れるã®ã‚’防㎠ã¾ã™ã€‚ * åˆæœŸtimelineを複数設定ã—ã¦ã„ã‚‹å ´åˆã®èªè¨¼æƒ…報入力回数を1回ã«å¤‰æ›´ * byte-compile後ã®clライブラリã¸ã®ä¾å­˜ã‚’解消 * 内蔵ã—ã¦ã„ã‚‹CA証明書を更新 内蔵ã—ã¦ã„ã‚‹CA証明書を`Equifax Secure Certificate Authority'ã§ç½®ã æ›ãˆã¾ã—ãŸã€‚ * StatusNetモードをサãƒãƒ¼ãƒˆ `twittering-mode.el'ã‚’StatusNet用ã«åˆ‡ã‚Šæ›¿ãˆã‚‰ã‚Œã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã—ãŸã€‚ "(setq twittering-service-method 'statusnet)"ã¨ã„ã†è¨­å®šã§åˆ‡ã‚Šæ›¿ã‚ りã¾ã™ã€‚Twitterã¨StatusNetã‚’åŒæ™‚ã«ä½¿ã†ã“ã¨ã¯ã§ãã¾ã›ã‚“ã®ã§æ³¨æ„ã—㦠ãã ã•ã„。 StatusNetå‘ã‘ã«ä½¿ã†ã«ã¯ãƒ›ã‚¹ãƒˆæƒ…å ±ã®è¨­å®šã‚‚å¿…è¦ã«ãªã‚Šã¾ã™ã€‚ `http://identi.ca/'ã§ã®ã‚µãƒ¼ãƒ“スã®å ´åˆã€ä»¥ä¸‹ã®ã‚ˆã†ãªè¨­å®šãŒå¿…è¦ã§ã™ã€‚ (setq twittering-service-method 'statusnet) (setq twittering-auth-method 'basic) (setq twittering-username "YOUR-ACCOUNT-NAME") ;; host (setq twittering-api-host "identi.ca") (setq twittering-api-search-host "identi.ca") (setq twittering-web-host "identi.ca") ;; paths for API (setq twittering-api-prefix "api/") (setq twittering-search-api-method "api/search") (setq twittering-web-path-prefix "") * "U"ã§tweet中ã®URIã‚„ãã®tweet自体ã¸ã®URIをコピー Thanks to Faried Nawaz. * "C-"ã§tweetをコピー Thanks to Faried Nawaz. * wgetã«ã‚ˆã‚‹tweetå–å¾—ã«å¯¾å¿œ Twitterサーãƒã¨ã®é€šä¿¡ã«å¤–部プログラムwgetを使ãˆã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã—ãŸã€‚ 下記ã®è¨­å®šã§wgetãŒå„ªå…ˆã—ã¦ä½¿ã‚れるよã†ã«ãªã‚Šã¾ã™ã€‚ (setq twittering-connection-type-order '(wget curl native)) * ç¾åœ¨ã®é€šä¿¡æ–¹æ³•(connection method)をモードライン上ã«è¡¨ç¤º デフォルトã§ç¾åœ¨ã®é€šä¿¡æ–¹æ³•(connection method)ãŒãƒ¢ãƒ¼ãƒ‰ãƒ©ã‚¤ãƒ³ä¸Šã«è¡¨ç¤º ã•れã¾ã™ã€‚下記ã®è¨­å®šã§è¡¨ç¤ºã—ãªã„よã†ã«ã‚‚ã§ãã¾ã™ã€‚ (setq twittering-display-connection-method nil) * アイコンå–å¾—æ™‚ã®æƒ…å ±è¡¨ç¤ºã‚’ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã§æŠ‘åˆ¶ `twittering-url-show-status'ã®ãƒ‡ãƒ•ォルト値ãŒnilã«å¤‰æ›´ã•れã¾ã—ãŸã€‚ デフォルトã§ã¯ã‚¢ã‚¤ã‚³ãƒ³å–å¾—æ™‚ã®æƒ…å ±ã¯è¡¨ç¤ºã•れãªããªã‚Šã¾ã™ã€‚ * urlライブラリã«ã‚ˆã‚‹tweetå–å¾—ã«å¯¾å¿œ 通信方法(connection method)ã¨ã—ã¦`urllib-http'ã¨`urllib-https'を追加 ã—ã¾ã—ãŸã€‚`native'ã¨ã¯ç•°ãªã‚ŠHTTP redirectionもサãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã™ãŒ 動作ã¯é…ãã€ã¾ãŸä¸å®‰å®šã«ãªã‚‹å ´åˆã‚‚ã‚るよã†ã§ã™ã€‚ä»–ã®methodãŒåˆ©ç”¨ã§ãã‚‹ å ´åˆã«ã¯ãã¡ã‚‰ã‚’用ã„ã‚‹ã“ã¨ã‚’推奨ã—ã¾ã™ã€‚ `urllib-http',`urllib-https'を用ã„ã¦ã®BASICèªè¨¼,xAuthã§é–“é•ã£ãŸã‚¢ã‚«ã‚¦ ント情報を与ãˆã‚‹ã¨urlãƒ©ã‚¤ãƒ–ãƒ©ãƒªã®æ©Ÿèƒ½ã§å†å…¥åŠ›ã‚’æ±‚ã‚られã¾ã™ãŒã€å†å…¥åŠ› ã—ãŸæƒ…å ±ã§é€šä¿¡ã‚’続行ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。å†å…¥åŠ›ã‚’æ±‚ã‚られãŸã¨ãã¯C-g ã§ã‚­ãƒ£ãƒ³ã‚»ãƒ«ã—ã€æ”¹ã‚ã¦M-x twitを実行ã—ã¦ãã ã•ã„。 * ユーザã‹ã‚‰ã®å…¥åЛ待ã¡çŠ¶æ…‹ã«ãªã£ã¦ã‹ã‚‰å†æç”» 時刻やアイコン画åƒã®è¡¨ç¤ºã®ãŸã‚ã®tweetã®å†æç”»ã‚’ã€EmacsãŒãƒ¦ãƒ¼ã‚¶ã‹ã‚‰ã® 入力待ã¡çŠ¶æ…‹(idle状態)ã«å…¥ã‚Šã€ãã®çŠ¶æ…‹ãŒä¸€å®šæ™‚間継続ã—ã¦ã‹ã‚‰è¡Œã†ã‚ˆã†ã« ã—ã¾ã—ãŸã€‚å¾…ã¡æ™‚é–“ã¯å¤‰æ•°`twittering-timer-interval-for-redisplaying'㧠指定ã§ãã¾ã™ã€‚デフォルトã®å¾…ã¡æ™‚é–“ã¯1ç§’ã§ã™ã€‚ * curlã‚„wgetã§ã®ã‚¢ã‚¤ã‚³ãƒ³ç”»åƒå–å¾—ã«å¯¾å¿œ アイコン画åƒã®å–å¾—ã«tweetå–å¾—ã¨åŒã˜é€šä¿¡æ–¹æ³•(connection method)ãŒä½¿ãˆã‚‹ よã†ã«ãªã‚Šã¾ã—ãŸã€‚å„methodã®å„ªå…ˆé †ä½ã¯tweetå–å¾—ã¨åŒã˜ã変数 `twittering-connection-type-order'ã§æ±ºå®šã•れã¾ã™ã€‚ * アイコン画åƒå¤‰æ›´ãƒ—ログラムã®é…延呼ã³å‡ºã— アイコン画åƒã‚’指定ã•れãŸã‚µã‚¤ã‚ºã«å¤‰æ›´ã™ã‚‹ãŸã‚ã®ãƒ—ログラム(convert)実行 ã‚’EmacsãŒãƒ¦ãƒ¼ã‚¶ã‹ã‚‰ã®å…¥åЛ待ã¡çŠ¶æ…‹(idle状態)ã«ãªã£ã¦ä¸€å®šæ™‚é–“ãŒçµŒéŽã—㦠ã‹ã‚‰è¡Œã†ã‚ˆã†ã«ã—ã¾ã—ãŸã€‚å¾…ã¡æ™‚é–“ã¯å¤‰æ•° `twittering-url-request-sentinel-delay'ã§æŒ‡å®šã§ãã¾ã™ã€‚ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã® å¾…ã¡æ™‚é–“ã¯1ç§’ã§ã™ã€‚ * ã€ŒãŠæ°—ã«å…¥ã‚Šã€ã«å¯¾å¿œ ã€ŒãŠæ°—ã«å…¥ã‚Šã€ä¸€è¦§ã‚’表示ã™ã‚‹timeline specã¨ã—ã¦":favorites"㨠":favorites/USER"を追加ã—ã¾ã—ãŸã€‚":favorites/USER"ã§æŒ‡å®šã—ãŸãƒ¦ãƒ¼ã‚¶ã® ã€ŒãŠæ°—ã«å…¥ã‚Šã€ã‚’見るã“ã¨ãŒã§ãã¾ã™ã€‚`twittering-visit-timeline'(デフォ ルトã§ã¯"V"ã«bindã•れã¦ã„ã¾ã™)ã«å¯¾ã—ã¦":favorites/"ã¨å…¥åŠ›ã—ã¦Enter ã™ã‚‹ã¨ã€ç¶šã„ã¦ãƒ¦ãƒ¼ã‚¶åを補完入力ã§ãã¾ã™ã€‚ã€ŒãŠæ°—ã«å…¥ã‚Šã€ã¯å…ƒã€…ã®tweet㮠投稿時刻ã®é †ã«è¡¨ç¤ºã•れるã®ã§æ³¨æ„ã—ã¦ãã ã•ã„。ã“れã¯ã€ŒãŠæ°—ã«å…¥ã‚Šã€ã« 登録ã—ãŸæ™‚刻をå–å¾—ã™ã‚‹æ–¹æ³•ãŒãªã„ãŸã‚ã§ã™ã€‚ã¾ãŸã€å–å¾—ã§ãã‚‹ã€ŒãŠæ°—ã«å…¥ りã€ã¯æœ€å¤§20ä»¶ã§ã™ã€‚よりéŽåŽ»ã«ã•ã‹ã®ã¼ã£ã¦ã®å–å¾—ã¯æœªå¯¾å¿œã§ã™ã€‚ * æ–°ãŸã«ã„ãã¤ã‹ã®çŸ­ç¸®URL生æˆã‚µãƒ¼ãƒ“スã«å¯¾å¿œ æ–°ãŸã«`bit.ly', `goo.gl', `is.gd', `j.mp'ã«å¯¾å¿œã—ã¾ã—ãŸã€‚下記ã®ã‚ˆã†ãª è¨­å®šã§æœ‰åйã«ã§ãã¾ã™ã€‚ (setq twittering-tinyurl-service 'bit.ly) ;; bit.lyã®å ´åˆ (setq twittering-tinyurl-service 'goo.gl) ;; goo.glã®å ´åˆ (setq twittering-tinyurl-service 'is.gd) ;; is.gdã®å ´åˆ (setq twittering-tinyurl-service 'j.mp) ;; j.mpã®å ´åˆ `bit.ly'ã‚„`j.mp'を使ã†ã«ã¯ãŠæŒã¡ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã«å¿œã˜ã¦ä¸‹è¨˜ã®ã‚ˆã†ã« `twittering-bitly-login'ã¨`twittering-bitly-api-key'を設定ã—ã¦ãŠãå¿…è¦ãŒ ã‚りã¾ã™ã€‚ (setq twittering-bitly-login "YOUR-LOGIN-NAME") (setq twittering-bitly-api-key "YOUR-API-KEY") Thanks to Michael Kohl and Lars Gregori. * å…¬å¼ReTweetã«ã¤ã„ã¦ã®æ›¸å¼æŒ‡å®šå­"%c","%C","%@"ã®æ„味を変更 å…¬å¼ReTweetã®`created_at'ã¯ã€retweetã—ãŸæ™‚刻ã§ã¯ãªãオリジナル㮠tweetを投稿ã—ãŸæ™‚刻をæ„味ã™ã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã—ãŸã€‚ * spamé€ä¿¡è€…報告機能 関数`twittering-block-and-report-as-spammer'を追加ã—ã¾ã—ãŸã€‚tweet上㧠ã“ã®é–¢æ•°ã‚’呼ã³å‡ºã™ã¨ã€ãã®æŠ•ç¨¿è€…ã‚’ãƒ–ãƒ­ãƒƒã‚¯ã—ã€ã•らã«spamé€ä¿¡è€…ã¨ã—㦠報告ã§ãã¾ã™ã€‚ * ブロック機能 関数`twittering-block'を追加ã—ã¾ã—ãŸã€‚tweet上ã§ã“ã®é–¢æ•°ã‚’呼ã³å‡ºã™ã¨ã€ ãã®æŠ•ç¨¿è€…ã‚’ãƒ–ãƒ­ãƒƒã‚¯ã§ãã¾ã™ã€‚ * アイコン画åƒä¿å­˜æ©Ÿèƒ½ "(setq twittering-use-icon-storage t)"ã¨ã™ã‚‹ã“ã¨ã§ä¸€åº¦å–得・サイズ変 æ›´ã—ãŸã‚¢ã‚¤ã‚³ãƒ³ç”»åƒã‚’専用ã®ãƒ•ァイルã«ä¿å­˜ã—ã¦ãŠã‘るよã†ã«ãªã‚Šã¾ã—ãŸã€‚ ã“ã®æ©Ÿèƒ½ã¯ãƒ‡ãƒ•ォルトã§ã¯ç„¡åйã§ã™ã€‚次回以é™ã¯å°‚ç”¨ãƒ•ã‚¡ã‚¤ãƒ«ã«æ ¼ç´ã•れ㟠画åƒãŒå„ªå…ˆçš„ã«ä½¿ã‚れã¾ã™ã®ã§ã‚¢ã‚¤ã‚³ãƒ³å–得・サイズ変更ã«ã‹ã‹ã‚‹æ™‚é–“ãŒçœ ã‘ã¾ã™ã€‚ デフォルトã§ã¯ç›´è¿‘ã«æç”»ã•れãŸã‚¢ã‚¤ã‚³ãƒ³ã‚’最大500個ã¾ã§ä¿å­˜ã—ã¾ã™ã€‚ä¿ å­˜ã•れるアイコンã®å€‹æ•°ã¯å¤‰æ•°`twittering-icon-storage-limit'ã§å¤‰æ›´ã§ ãã¾ã™ã€‚ã“ã®å¤‰æ•°ã‚’nilã«è¨­å®šã™ã‚‹ã¨å…¨ã¦ã®ã‚¢ã‚¤ã‚³ãƒ³ãŒä¿å­˜ã•れã¾ã™ã€‚ アイコンをä¿å­˜ã™ã‚‹ãƒ•ァイルã¯ãƒ‡ãƒ•ォルトã§ã¯ `~/.twittering-mode-icons.gz'ã§ã™ãŒ`twittering-icon-storage-file'㨠ã„ã†å¤‰æ•°ã§å¤‰æ›´ã§ãã¾ã™ã€‚ã‚ã‚‹ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®Emacsã§ç”Ÿæˆã—ãŸã‚¢ã‚¤ã‚³ãƒ³ä¿å­˜ ファイルã¯åˆ¥ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§ã¯ä½¿ãˆãªã„æã‚ŒãŒã‚ã‚‹ã®ã§æ³¨æ„ã—ã¦ãã ã•ã„。 * æ–°ã—ã„æ›¸å¼æŒ‡å®šå­"%RT{...}" `twittering-status-format'ã§ä½¿ãˆã‚‹æ›¸å¼æŒ‡å®šå­ã¨ã—ã¦"%RT{...}"ãŒè¿½åŠ ã• ã‚Œã¾ã—ãŸã€‚ã“れã¯å¯¾è±¡ã¨ãªã‚‹tweetãŒå…¬å¼RTã®ã¨ãã ã‘æç”»ã•れã¾ã™ã€‚括弧 ã®ä¸­ã«ã¯ä»»æ„ã®æ–‡å­—åˆ—ã¨æ›¸å¼æŒ‡å®šå­ã‚’入れるã“ã¨ãŒã§ãã€æ‹¬å¼§å†…ã®æ›¸å¼æŒ‡å®š å­ã¯RTã•れãŸtweetã§ã¯ãªããã®RTè‡ªèº«ã®æƒ…報を使ã£ã¦æç”»ã•れã¾ã™ã€‚例㈠ã°ã€"%RT{%s}"ã¯RTã—ãŸãƒ¦ãƒ¼ã‚¶ã®screen_nameã¨ãªã‚Šã¾ã™ã€‚ * å…¬å¼ReTweetã®ã‚­ãƒ£ãƒ³ã‚»ãƒ« è‡ªåˆ†è‡ªèº«ãŒæŠ•ç¨¿ã—ãŸå…¬å¼ReTweetã‚’tweet削除ã¨åŒã˜æ“作(デフォルト㧠ã¯'C-cD')ã§ã‚­ãƒ£ãƒ³ã‚»ãƒ«ã§ãるよã†ã«ãªã‚Šã¾ã—ãŸã€‚ * ã‚るユーザãŒãƒ•ォローã—ã¦ã„るリストã®è£œå®Œä»˜ãé¸æŠžæ©Ÿèƒ½ 'C-uL'ã§ç‰¹å®šãƒ¦ãƒ¼ã‚¶ãŒãƒ•ォローã—ã¦ã„るリストを補完付ãã§é¸æŠžã—ã€é–‹ã‘ã‚‹ よã†ã«ãªã‚Šã¾ã—ãŸã€‚ * Edit skeleton 投稿内容編集開始時ã«çжæ³ã«å¿œã˜ã¦è‡ªå‹•çš„ã«æ–‡å­—を追加ã§ãる仕組ã¿ã‚’å°Žå…¥ ã—ã¾ã—ãŸã€‚edit skeletonã¯ã„ã¤ã€ã©ã®ã‚ˆã†ãªæ–‡å­—列を先頭ã«ã€ã‚ã‚‹ã„ã¯æœ« å°¾ã«è¿½åŠ ã™ã‚‹ã‹ã®è¦å‰‡ã§ã™ã€‚連想リスト`twittering-edit-skeleton-alist' ã«è¦ç´ ã‚’追加ã™ã‚‹ã“ã¨ã§ã€æ–°ã—ã„edit skeletonを定義ã§ãã¾ã™ã€‚edit skeletonã®å®šç¾©æ–¹æ³•ã®è©³ç´°ã«ã¤ã„ã¦ã¯`twittering-edit-skeleton-alist'ã® docstringã‚’å‚ç…§ãã ã•ã„。 デフォルトã§ã¯ä»¥ä¸‹ã®edit skeletonãŒå®šç¾©ã•れã¦ã„ã¾ã™ã€‚ none: 何も追加ã—ã¾ã›ã‚“。 footer: `twittering-edit-skeleton-footer'ã§æŒ‡å®šã•ã‚ŒãŸæ–‡å­—列をフッタ ã¨ã—ã¦æœ«å°¾ã«è¿½åŠ ã—ã¾ã™ã€‚ footer-only-normal: footerã¨åŒæ§˜ã§ã™ãŒreplyã‚„direct messageを編集㙠る際ã«ã¯è¿½åŠ ã‚’è¡Œã„ã¾ã›ã‚“。 inherit-hashtags: 返信先ã«å«ã¾ã‚Œã‚‹ãƒãƒƒã‚·ãƒ¥ã‚¿ã‚°ã‚’末尾ã«è¿½åŠ ã—ã¾ã™ã€‚ inherit-mentions: 返信先ã«å«ã¾ã‚Œã‚‹ãƒ¦ãƒ¼ã‚¶å‚照を先頭ã«è¿½åŠ ã—ã¾ã™ã€‚ inherit-any: 返信先ã«å«ã¾ã‚Œã‚‹ãƒãƒƒã‚·ãƒ¥ã‚¿ã‚°ã‚„ユーザå‚照を追加ã—ã¾ã™ã€‚ 関数`twittering-switch-edit-skeleton'ã§æœ‰åйãªedit skeletonを切り替㈠るã«ã¯ã“ã¨ãŒã§ãã¾ã™ã€‚ ã¾ãŸã€ãƒ•ッタ文字列`twittering-edit-skeleton-footer'ã®å†…容ã¯é–¢æ•° `twittering-edit-skeleton-change-footer'ã§å¤‰æ›´ã§ãã¾ã™ã€‚ * 代替画åƒå½¢å¼ã‚’指定ã™ã‚‹å¤‰æ•° アイコン画åƒã®å½¢å¼ãŒEmacsã«ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ãªã„å½¢å¼ã§ã‚ã‚‹å ´åˆã€ç”»åƒ ã‚’EmacsãŒã‚µãƒãƒ¼ãƒˆã™ã‚‹å½¢å¼ã«å¤‰æ›ã—ã¦ã‹ã‚‰è¡¨ç¤ºã™ã‚‹ã®ã§ã™ãŒã€ãã®éš›ã®å¤‰ æ›å…ˆã®ç”»åƒå½¢å¼ã‚’指定ã™ã‚‹å¤‰æ•°`twittering-fallback-image-format'を追加 ã—ã¾ã—ãŸã€‚デフォルトã®å½¢å¼ã¯XPMã§ã™ã€‚ 下記ã®ã‚ˆã†ã«è¨­å®šã™ã‚Œã°ã€NTEmacsã§XPMを表示ã™ã‚‹éš›ã®ä¸è‡ªç„¶ãªæŒ™å‹•ã‚’å›žé¿ ã§ãã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。 Thanks to Silver Chariot. (setq twittering-fallback-image-format 'png) ### ãƒã‚°ä¿®æ­£ * Emacs 23以é™ã«åŒæ¢±ã•れã¦ã„ã‚‹urlライブラリã§ã‚‚æ­£ã—ãå‹•ãよã†ä¿®æ­£ * 外部コマンドcURLã§bodyãŒç©ºã®POSTã‚’æ­£ã—ã行ãˆã‚‹ã‚ˆã†ä¿®æ­£ * Native retweetã‚’ã•らã«retweetã§ãるよã†ä¿®æ­£ オリジナルã®tweetã¸ã®retweet扱ã„ã«ãªã‚Šã¾ã™ã€‚ * アカウントèªè¨¼æ™‚ã«ç™ºç”Ÿã™ã‚‹å¯èƒ½æ€§ã®ã‚ã£ãŸç«¶åˆçŠ¶æ…‹ãŒèµ·ã“らãªã„よã†ä¿®æ­£ * 返信先ã¨ã—ã¦è¡¨ç¤ºã•れã¦ã„ã‚‹tweetã¸ã®è¿”ä¿¡ã‚’æ­£ã—ãæ‰±ã†ã‚ˆã†ä¿®æ­£ `twittering-show-replied-statuses'ã§è¿”ä¿¡å…ˆã¨ã—ã¦è¡¨ç¤ºã•れã¦ã„ã‚‹tweet㫠対ã—ã¦`twittering-enter'ã§è¿”ä¿¡ã—ãŸã¨ãã«ã€ã‚«ãƒ¼ã‚½ãƒ«ä¸‹ã®tweetã«å¯¾ã™ã‚‹ 返信ã¨ãªã‚‹ã‚ˆã†ä¿®æ­£ã—ã¾ã—ãŸã€‚ Thanks to Naohiro Aota. * æ›¸å¼æŒ‡å®šå­"%L"ã®æŒ¯èˆžã„を修正 `twittering-status-format'ã®docstringã®é€šã‚Šã«ç©ºç™½ãŒæŒ¿å…¥ã•れるよã†ã« ãªã‚Šã¾ã—ãŸã€‚ Thanks to Tom X. Tobin. * アイコン画åƒå–å¾—ã®éš›ã«åŒä¸€sentinelを複数回登録ã—ã¦ã„ãŸã®ã‚’修正 1.0.0: 2010-06-05 ------------------ ### é‡è¦ãªãŠçŸ¥ã‚‰ã› #### ミニãƒãƒƒãƒ•ã‚¡ã‹ã‚‰ã®æŠ•稿ã¯ã‚µãƒãƒ¼ãƒˆå»ƒæ­¢äºˆå®šã§ã™ twittering-modeã§tweetを投稿ã™ã‚‹ã«ã¯ã€ã“れã¾ã§ã¯ãƒŸãƒ‹ãƒãƒƒãƒ•ã‚¡ã‹ã‚‰å…¥åŠ›ã™ ã‚‹æ–¹æ³•ã‚’æŽ¡ç”¨ã—ã¦ã„ã¾ã—ãŸãŒã€ä»Šå›žæ–°æ©Ÿèƒ½ã¨ã—ã¦ãƒãƒƒãƒ—アップãƒãƒƒãƒ•ã‚¡ã‹ã‚‰æŠ• 稿ã§ãる機能を実装ã—ã¾ã—ãŸã€‚変数 `twittering-update-status-function` ã‚’ 設定ã™ã‚‹ã“ã¨ã«ã‚ˆã£ã¦ã“ã®2ã¤ã®æ–¹æ³•を切り替ãˆã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚今回ã®ãƒªãƒªãƒ¼ スã§ã¯ã€æ–°ã—ã„ãƒãƒƒãƒ—アップãƒãƒƒãƒ•ã‚¡ãŒãƒ‡ãƒ•ォルトã«è¨­å®šã•れã¦ã„ã¾ã™ã€‚å¾“æ¥ é€šã‚ŠãƒŸãƒ‹ãƒãƒƒãƒ•ã‚¡ã‹ã‚‰æŠ•稿ã—ãŸã„å ´åˆã¯ã€ã“ã®å¤‰æ•°ã®å€¤ã‚’ twittering-update-status-from-minibuffer ã«è¨­å®šã—ã¦ãã ã•ã„。 ãƒãƒƒãƒ—アップãƒãƒƒãƒ•ã‚¡ã«ã‚ˆã‚‹æŠ•稿ã§ã¯ã€å¾“æ¥ã®æŠ•ç¨¿æ–¹æ³•ã«æ¯”ã¹ã¦æ¬¡ã®ã‚ˆã†ãªåˆ© 点ãŒã‚りã¾ã™: * tweet入力時ã«IMEç­‰ã¨å¹²æ¸‰ã—ãªã„ * 入力途中ã§èª¤ã£ã¦æŠ•稿ã—ã¦ã—ã¾ã†ãƒŸã‚¹ãŒãŠãã«ãã„ * å…¥åŠ›å†…å®¹ã®æ–‡å­—数を表示ã—ã¦ãれる ### 改良 * ãƒãƒƒãƒ—アップãƒãƒƒãƒ•ァを用ã„ãŸtweetã®ç·¨é›†ã€æŠ•稿機能 * 環境変数 http_proxy, HTTP_PROXY を利用ã—ãŸè‡ªå‹•プロキシ設定 * å…¬å¼ReTweetサãƒãƒ¼ãƒˆ * タイムライン表示ã®ãƒ•ォーマット指定å­ã«æ–°ãŸãªã‚‚ã®ã‚’追加 * 一時ファイルを生æˆã—ãªã„ç”»åƒãƒ•ァイル表示方法を採用 * 'timeline spec'å°Žå…¥ã«ã‚ˆã‚‹æŸ”軟ãªã‚¿ã‚¤ãƒ ãƒ©ã‚¤ãƒ³è¡¨ç¤ºæ©Ÿèƒ½ * 'timeline spec'å°Žå…¥ã«ã‚ˆã‚‹è¤‡æ•°ã‚¿ã‚¤ãƒ ãƒ©ã‚¤ãƒ³ãƒ»è¤‡æ•°ãƒãƒƒãƒ•ァ表示ã®ã‚µãƒãƒ¼ãƒˆ * `twittering-initial-timeline-spec-string'を設定ã™ã‚‹ã“ã¨ã§ã€åˆæœŸåŒ–時 ã«è¤‡æ•°ã®ã‚¿ã‚¤ãƒ ãƒ©ã‚¤ãƒ³ã‚’表示ã•ã›ã‚‹ã“ã¨ãŒå¯èƒ½ * 自動更新ã®on/offをサãƒãƒ¼ãƒˆ(キーボードã®'a'ã§åˆ‡ã‚Šæ›¿ãˆ) * global-font-lockモードã¨ã®è¦ªå’Œæ€§å‘上 * モードラインã§ã®æœªèª­é€šçŸ¥ (experimental) * ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆæŒ‡å®šå­ "%FILL{...}" ã®ä¿®æ­£ * タイムラインã®åˆ‡ã‚Šæ›¿ãˆæ©Ÿèƒ½(キーボード㮠'f' 㨠'b' ã§åˆ‡ã‚Šæ›¿ãˆ) * SSLã®æœ‰åй/無効をモードラインã®ç”»åƒã§è¡¨ç¤º * アイコン画åƒã®éžåŒæœŸãªå–å¾—ã¨è¡¨ç¤º * tweetã®å‰Šé™¤æ©Ÿèƒ½('C-cD' ã§å‰Šé™¤) * 'gnutls', 'openssl'コマンドを利用ã—ãŸtlsライブラリã«ã‚ˆã‚‹HTTPS通信 * HTTPã¨HTTPSã«å€‹åˆ¥ã®ãƒ—ロキシを設定å¯èƒ½ã« * ç”»åƒå–得時ã®å‡ºåŠ›ã‚’æŠ‘åˆ¶ * .emacs ã« (setq twittering-url-show-status nil) を追加ã™ã‚‹ã“ã¨ã§æœ‰ 効ã«ã§ãã‚‹ * OAuthèªè¨¼å¯¾å¿œ 0.9: 2009-12-29 ----------------- ### 改良 * GitHubã¸ç§»å‹• * è‹±èªžã¨æ—¥æœ¬èªžã§Webサイトを開設 * cURLãŒåˆ©ç”¨å¯èƒ½ãªã¨ãã¯HTTPSを使ã£ã¦ã‚»ã‚­ãƒ¥ã‚¢ã«é€šä¿¡ã™ã‚‹ã‚ˆã†ã« * リスト対応 * フォロー/リムーブ対応 * ãŠæ°—ã«å…¥ã‚Šæ©Ÿèƒ½ã«å¯¾å¿œ * ãƒãƒƒã‚·ãƒ¥ã‚¿ã‚°å¯¾å¿œ * ダイレクトメッセージé€ä¿¡ã«å¯¾å¿œ * URLã‚’ãã®å ´ã§TinyURL化ã™ã‚‹æ©Ÿèƒ½ * å…¥åŠ›æ–‡å­—åˆ—ã®æ–‡å­—æ•°ãƒã‚§ãƒƒã‚¯ * ReTweetã®å½¢å¼ã‚’é¸æŠžå¯èƒ½ã« * 閲覧ã—ãŸãƒ¦ãƒ¼ã‚¶ãƒ¼åã‚„ã€é€ä¿¡ã—ãŸã¤ã¶ã‚„ãã®å±¥æ­´ã‚’ä¿å­˜ * 一度ã«å–å¾—ã™ã‚‹ã¤ã¶ã‚„ãã®æ•°ã‚’パラメータ化 * ユーザーåã‚„URLãªã©ã®è¦ç´ ã‚’TABキーã§ç§»å‹•å¯èƒ½ã« * 'file'コマンドを利用ã—ãŸç”»åƒã®ç¨®é¡žã®åˆ¤åˆ¥ * よりã‚ã‹ã‚Šã‚„ã™ã„エラー出力 * å–得済ã¿ã®ã‚¿ã‚¤ãƒ ãƒ©ã‚¤ãƒ³ã®ãƒ‡ãƒ¼ã‚¿ã‚’ä¿æŒã™ã‚‹ã‚ˆã†ã« * サスペンド機能 * ImagemagickãŒåˆ©ç”¨å¯èƒ½ãªã¨ãã¯ç”»åƒã®ãƒªã‚µã‚¤ã‚ºã‚’行ã†ã‚ˆã†ã« * å˜ä½“テストフレームワークã®å°Žå…¥ * 'Proxy-connection: Keep-Alive'ã¸ã®å¯¾å¿œ * æŸ”è»Ÿãªæ–‡å­—列フォーマット関数ã®å°Žå…¥(twittering-format-string) * HTTPレスãƒãƒ³ã‚¹å‡¦ç†ã®åŠ¹çŽ‡æ”¹å–„ ### ãƒã‚°ä¿®æ­£ * マウスクリックやEnterキーã§URLã‚’é–‹ã‘ãªã„å•題を修正 * ReTweetã®ã¨ãã¯ã‚ªãƒªã‚¸ãƒŠãƒ«IDを設定ã—ãªã„よã†ã« * URLæŠ½å‡ºã®æ­£è¦è¡¨ç¾ã‚’修正 * ãƒ¦ãƒ¼ã‚¶ãƒ¼åæŠ½å‡ºã®å‡¦ç†ã‚’修正 * ãƒ¢ãƒ¼ãƒ‰ãƒ©ã‚¤ãƒ³ã‚’å³æ™‚æ›´æ–°ã™ã‚‹ã‚ˆã†ä¿®æ­£ * å„HTTPセッションã”ã¨ã«ä¸€æ™‚ãƒãƒƒãƒ•ァを利用ã™ã‚‹ã‚ˆã†å¤‰æ›´ * MD5ãƒãƒƒã‚·ãƒ¥ã‚’利用ã—ã¦åŒã˜åå‰ã®ç”»åƒãƒ•ァイルã®è¡çªã‚’å›žé¿ * センティãƒãƒ«ã§ãƒãƒƒãƒ•ã‚¡ã‚’killã™ã‚‹éš›ã®ã‚¨ãƒ©ãƒ¼å‡¦ç† * ã„ãã¤ã‹ã®èª¤å­—修正 ### æ„Ÿè¬ * Alberto Garcia * Jaemok Jeong * Kouhei Sutou * Naohiro Aota * Satoshi Yatagawa * Tadashi MATSUO * Thomas Danckaert * Tsuyoshi CHO * IMAI Toshiyuki twittering-mode-3.1.0/INSTALL0000664000175000017500000000260712772521564015524 0ustar tadashitadashi Installation Guide ================== For Windows users ----------------- * Uncompress the archive file, and add a path of a directory containing `twittering-mode.el` to your `load-path`. * For example, if you uncompressed it under `C:\foo\`, there may be a directory `C:\foo\twittering-mode-X.X.X\` which contains `twittering-mode.el`. So add the following code to your `.emacs` (add-to-list 'load-path "C:/foo/twittering-mode-X.X.X") * Proceed to **Set up your Emacs** For Linux and other Unix users ------------------------------ * Uncompress the archive file, and add a path of a directory containing `twittering-mode.el` to your `load-path`. * For example, if you uncompressed it under `/path/to/foo`, there may be a directory `/path/to/foo/twittering-mode-X.X.X/` which contains `twittering-mode.el`. So add the following code to your `.emacs` (add-to-list 'load-path "/path/to/foo/twittering-mode-X.X.X") * Install cURL, gnutls, or openssl for using SSL connection. * Proceed to **Set up your Emacs** Set up your Emacs ----------------- * Add following code to your `.emacs`: (require 'twittering-mode) Run twittering-mode ------------------- 1. Execute `M-x twit` to run twittering-mode. 2. Open OAuth authorization page with your browser, click "Allow", and enter the PIN code. 3. Your friends' timeline will appear. Enjoy! twittering-mode-3.1.0/INSTALL.ja0000664000175000017500000000310012772521564016102 0ustar tadashitadashi ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã®æ‰‹å¼•ã ====================== Windows --------- * twittering-modeã®ãƒ•ァイルを展開ã—ã¦ç¾ã‚ŒãŸãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’`load-path`㫠追加ã™ã‚‹ã€‚ * 例: `C:\foo\`ã¨ã„ã†ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®ä¸‹ã«å±•é–‹ã—ãŸã¨ã™ã‚‹ã¨ã€ `twittering-mode.el`ãŒå…¥ã£ã¦ã„るディレクトリ `C:\foo\twittering-mode-X.X.X\`ãŒã‚ã‚‹ã¯ãšãªã®ã§ã€`.emacs`ã«æ¬¡ã®å†…容 を追加ã™ã‚‹: (add-to-list 'load-path "C:/foo/twittering-mode-X.X.X") * **Emacsã®è¨­å®š** ã¸é€²ã‚€ Linuxã‚„ãã®ä»–Unix環境 ----------------------- * twittering-modeã®ãƒ•ァイルを展開ã—ã¦ç¾ã‚ŒãŸãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’`load-path`㫠追加ã™ã‚‹ã€‚ * 例: `/path/to/foo`ã¨ã„ã†ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®ä¸‹ã«å±•é–‹ã—ãŸã¨ã™ã‚‹ã¨ã€ `twittering-mode.el`ãŒå…¥ã£ã¦ã„るディレクトリ `/path/to/foo/twittering-mode-X.X.X/`ãŒã‚ã‚‹ã¯ãšãªã®ã§ã€`.emacs`ã«æ¬¡ã®å†…容 を追加ã™ã‚‹: (add-to-list 'load-path "/path/to/foo/twittering-mode-X.X.X") * SSL通信を利用ã™ã‚‹ãŸã‚ã«ã¯ã€cURLã€gnutlsã€opensslã®ã©ã‚Œã‹ã‚’インストー ルã—ã¦ãŠã * **Emacsã®è¨­å®š** ã¸é€²ã‚€ Emacsã®è¨­å®š ------------- * 次ã®ã‚³ãƒ¼ãƒ‰ã‚’`.emacs`ã«è¿½åŠ ã™ã‚‹: (require 'twittering-mode) twittering-modeã‚’å‹•ã‹ã™ ------------------------- 1. `M-x twit`を実行 2. ç”»é¢ã®æŒ‡ç¤ºã«å¾“ã„OAuthã®èªè¨¼ãƒšãƒ¼ã‚¸ã‚’é–‹ãã€"Allow"ボタンをクリックã—ã¦ã€ 表示ã•れãŸPINコードをEmacsã«å…¥åŠ›ã™ã‚‹ 3. Twitterã®ã‚¿ã‚¤ãƒ ãƒ©ã‚¤ãƒ³ãŒè¡¨ç¤ºã•れるã¯ãš! twittering-mode-3.1.0/win-curl/0000775000175000017500000000000012772521564016226 5ustar tadashitadashitwittering-mode-3.1.0/win-curl/docs/0000775000175000017500000000000012772521564017156 5ustar tadashitadashitwittering-mode-3.1.0/win-curl/docs/LICENSE.OpenSSL.txt0000664000175000017500000001420712772521564022267 0ustar tadashitadashi LICENSE ISSUES ============== The OpenSSL toolkit stays under a dual license, i.e. both the conditions of the OpenSSL License and the original SSLeay license apply to the toolkit. See below for the actual license texts. Actually both licenses are BSD-style Open Source licenses. In case of any license issues related to OpenSSL please contact openssl-core@openssl.org. OpenSSL License --------------- /* ==================================================================== * Copyright (c) 1998-2003 The OpenSSL Project. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. All advertising materials mentioning features or use of this * software must display the following acknowledgment: * "This product includes software developed by the OpenSSL Project * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" * * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to * endorse or promote products derived from this software without * prior written permission. For written permission, please contact * openssl-core@openssl.org. * * 5. Products derived from this software may not be called "OpenSSL" * nor may "OpenSSL" appear in their names without prior written * permission of the OpenSSL Project. * * 6. Redistributions of any form whatsoever must retain the following * acknowledgment: * "This product includes software developed by the OpenSSL Project * for use in the OpenSSL Toolkit (http://www.openssl.org/)" * * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * ==================================================================== * * This product includes cryptographic software written by Eric Young * (eay@cryptsoft.com). This product includes software written by Tim * Hudson (tjh@cryptsoft.com). * */ Original SSLeay License ----------------------- /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * * This package is an SSL implementation written * by Eric Young (eay@cryptsoft.com). * The implementation was written so as to conform with Netscapes SSL. * * This library is free for commercial and non-commercial use as long as * the following conditions are aheared to. The following conditions * apply to all code found in this distribution, be it the RC4, RSA, * lhash, DES, etc., code; not just the SSL code. The SSL documentation * included with this distribution is covered by the same copyright terms * except that the holder is Tim Hudson (tjh@cryptsoft.com). * * Copyright remains Eric Young's, and as such any Copyright notices in * the code are not to be removed. * If this package is used in a product, Eric Young should be given attribution * as the author of the parts of the library used. * This can be in the form of a textual message at program startup or * in documentation (online or textual) provided with the package. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * "This product includes cryptographic software written by * Eric Young (eay@cryptsoft.com)" * The word 'cryptographic' can be left out if the rouines from the library * being used are not cryptographic related :-). * 4. If you include any Windows specific code (or a derivative thereof) from * the apps directory (application code) you must include an acknowledgement: * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" * * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * The licence and distribution terms for any publically available version or * derivative of this code cannot be changed. i.e. this code cannot simply be * copied and put under another distribution licence * [including the GNU Public Licence.] */ twittering-mode-3.1.0/win-curl/docs/README0000664000175000017500000000441512772521564020042 0ustar tadashitadashi _ _ ____ _ ___| | | | _ \| | / __| | | | |_) | | | (__| |_| | _ <| |___ \___|\___/|_| \_\_____| README Curl is a command line tool for transfering data specified with URL syntax. Find out how to use Curl by reading the curl.1 man page or the MANUAL document. Find out how to install Curl by reading the INSTALL document. libcurl is the library curl is using to do its job. It is readily available to be used by your software. Read the libcurl.3 man page to learn how! You find answers to the most frequent questions we get in the FAQ document. Study the COPYING file for distribution terms and similar. CONTACT If you have problems, questions, ideas or suggestions, please contact us by posting to a suitable mailing list. See http://curl.haxx.se/mail/ Many major contributors to the project are listed in the THANKS document. WEB SITE Visit the curl web site or mirrors for the latest news: Sweden -- http://curl.haxx.se/ Russia -- http://curl.tsuren.net/ US -- http://curl.sf.net/ Australia -- http://curl.planetmirror.com/ DOWNLOAD The official download mirror sites are: Sweden -- ftp://ftp.sunet.se/pub/www/utilities/curl/ Sweden -- http://cool.haxx.se/curl/ Germany -- ftp://ftp.fu-berlin.de/pub/unix/network/curl/ Australia -- http://curl.planetmirror.com/download/ US -- http://curl.sourceforge.net/download/ Hongkong -- http://www.execve.net/curl/ Russia -- http://curl.tsuren.net/download/ CVS To download the very latest source off the CVS server do this: cvs -d :pserver:cvsread@cvs.php.net:/repository login (enter "phpfi" when asked for password) cvs -d :pserver:cvsread@cvs.php.net:/repository co curl (you'll get a directory named curl created, filled with the source code) cvs -d :pserver:cvsread@cvs.php.net:/repository logout (you're off the hook!) NOTICE Curl contains pieces of source code that is Copyright (c) 1998, 1999 Kungliga Tekniska Högskolan. This notice is included here to comply with the distribution terms. twittering-mode-3.1.0/win-curl/docs/README.win320000664000175000017500000000150012772521564020773 0ustar tadashitadashi _ _ ____ _ ___| | | | _ \| | / __| | | | |_) | | | (__| |_| | _ <| |___ \___|\___/|_| \_\_____| README.win32 Read the README file first. Curl has been compiled, built and run on all sorts of Windows and win32 systems. While not being the main develop target, a fair share of curl users are win32-based. The unix-style man pages are tricky to read on windows, so therefore are all those pages converted to HTML as well as pdf, and included in the release archives. The main curl.1 man page is also "built-in" in the command line tool. Use a command line similar to this in order to extract a separate text file: curl -M >manual.txt twittering-mode-3.1.0/win-curl/docs/FAQ0000664000175000017500000007574512772521564017532 0ustar tadashitadashiUpdated: June 17, 2003 (http://curl.haxx.se/docs/faq.html) _ _ ____ _ ___| | | | _ \| | / __| | | | |_) | | | (__| |_| | _ <| |___ \___|\___/|_| \_\_____| FAQ 1. Philosophy 1.1 What is cURL? 1.2 What is libcurl? 1.3 What is cURL not? 1.4 When will you make curl do XXXX ? 1.5 Who makes cURL? 1.6 What do you get for making cURL? 1.7 What about CURL from curl.com? 1.8 I have a problem who do I mail? 2. Install Related Problems 2.1 configure doesn't find OpenSSL even when it is installed 2.1.1. native linker doesn't find openssl 2.1.2. only the libssl lib is missing 2.2 Does curl work/build with other SSL libraries? 2.3 Where can I find a copy of LIBEAY32.DLL? 2.4 Does cURL support Socks (RFC 1928) ? 3. Usage Problems 3.1 curl: (1) SSL is disabled, https: not supported 3.2 How do I tell curl to resume a transfer? 3.3 Why doesn't my posting using -F work? 3.4 How do I tell curl to run custom FTP commands? 3.5 How can I disable the Pragma: nocache header? 3.6 Does curl support ASP, XML, XHTML or HTML version Y? 3.7 Can I use curl to delete/rename a file through FTP? 3.8 How do I tell curl to follow HTTP redirects? 3.9 How do I use curl in my favorite programming language? 3.10 What about SOAP, WebDAV, XML-RPC or similar protocols over HTTP? 3.11 How do I POST with a different Content-Type? 3.12 Why do FTP specific features over HTTP proxy fail? 3.13 Why does my single/double quotes fail? 3.14 Does curl support javascript or pac (automated proxy config)? 4. Running Problems 4.1 Problems connecting to SSL servers. 4.2 Why do I get problems when I use & or % in the URL? 4.3 How can I use {, }, [ or ] to specify multiple URLs? 4.4 Why do I get downloaded data even though the web page doesn't exist? 4.5 Why do I get return code XXX from a HTTP server? 4.5.1 "400 Bad Request" 4.5.2 "401 Unauthorized" 4.5.3 "403 Forbidden" 4.5.4 "404 Not Found" 4.5.5 "405 Method Not Allowed" 4.5.6 "301 Moved Permanently" 4.6 Can you tell me what error code 142 means? 4.7 How do I keep user names and passwords secret in Curl command lines? 4.8 I found a bug! 4.9 Curl can't authenticate to the server that requires NTLM? 4.10 My HTTP request using HEAD, PUT or DELETE doesn't work! 4.11 Why does my HTTP range requests return the full document? 4.12 Why do I get "certificate verify failed" ? 5. libcurl Issues 5.1 Is libcurl thread-safe? 5.2 How can I receive all data into a large memory chunk? 5.3 How do I fetch multiple files with libcurl? 5.4 Does libcurl do Winsock initing on win32 systems? 5.5 Does CURLOPT_FILE and CURLOPT_INFILE work on win32 ? 5.6 What about Keep-Alive or persistent connections? 5.7 Link errors when building libcurl on Windows! 6. License Issues 6.1 I have a GPL program, can I use the libcurl library? 6.2 I have a closed-source program, can I use the libcurl library? 6.3 I have a BSD licensed program, can I use the libcurl library? 6.4 I have a program that uses LGPL libraries, can I use libcurl? 6.5 Can I modify curl/libcurl for my program and keep the changes secret? 6.6 Can you please change the curl/libcurl license to XXXX? ============================================================================== 1. Philosophy 1.1 What is cURL? cURL (or simply just 'curl') is a command line tool for getting or sending files using URL syntax. The name is a play on 'Client for URLs', originally with URL spelled in uppercase to make it obvious it deals with URLs. The fact it can also be pronounced 'see URL' also helped, it works as an abbrivation for "Client URL Request Library" or why not the recursive version: "Curl is a URL Request Library". Curl supports a range of common Internet protocols, currently including HTTP, HTTPS, FTP, FTPS, GOPHER, LDAP, DICT, TELNET and FILE. We spell it cURL or just curl. We pronounce it with an initial k sound: [kurl]. NOTE: there are numerous sub-projects and related projects that also use the word curl in the project names in various combinations, but you should take notice that this FAQ is directed at the command-line tool named curl (and libcurl the library), and may therefore not be valid for other curl projects. 1.2 What is libcurl? libcurl is a reliable and portable library which provides you with an easy interface to a range of common Internet protocols. You can use libcurl for free in your application even if it is commercial or closed-source. 1.3 What is cURL not? Curl is *not* a wget clone even though that is a very common misconception. Never, during curl's development, have we intended curl to replace wget or compete on its market. Curl is targeted at single-shot file transfers. Curl is not a web site mirroring program. If you wanna use curl to mirror something: fine, go ahead and write a script that wraps around curl to make it reality (like curlmirror.pl does). Curl is not an FTP site mirroring program. Sure, get and send FTP with curl but if you want systematic and sequential behavior you should write a script (or write a new program that interfaces libcurl) and do it. Curl is not a PHP tool, even though it works perfectly well when used from or with PHP. Curl is not a single-OS program. Curl exists, compiles, builds and runs under a wide range of operating systems, including all modern Unixes (and a bunch of older ones too), Windows, Amiga, BeOS, OS/2, OS X, QNX etc. 1.4 When will you make curl do XXXX ? We love suggestions of what to change in order to make curl and libcurl better. We do however believe in a few rules when it comes to the future of curl: * Curl -- the command line tool -- is to remain a non-graphical command line tool. If you want GUIs or fancy scripting capabilities, you should look for another tool that uses libcurl. * We do not add things to curl that other small and available tools already do very fine at the side. Curl's output is fine to pipe into another program or redirect to another file for the next program to interpret. * We focus on protocol related issues and improvements. If you wanna do more magic with the supported protocols than curl currently does, chances are big we will agree. If you wanna add more protocols, we may very well agree. * If you want someone else to make all the work while you wait for us to implement it for you, that is not a very friendly attitude. We spend a considerable time already on maintaining and developing curl. In order to get more out of us, you should consider trading in some of your time and efforts in return. * If you write the code, chances are bigger that it will get into curl faster. 1.5 Who makes cURL? cURL and libcurl are not made by any single individual. Sure, Daniel Stenberg writes the major parts, but other persons' submissions are important and crucial. Anyone can contribute and post their changes and improvements and have them inserted in the main sources (of course on the condition that developers agree on that the fixes are good). The list of contributors in the docs/THANKS file is only a small part of all the people that every day provide us with bug reports, suggestions, ideas and source code. curl is developed by a community, with Daniel at the wheel. 1.6 What do you get for making cURL? Project cURL is entirely free and open. No person gets paid for developing curl. We do this voluntarily on our spare time. We get some help from companies. Contactor Data hosts the curl web site, Haxx owns the curl web site's domain and sourceforge.net hosts several project services we take advantage from, like the bug tracker, mailing lists and more. If you want to support our project with a donation or similar, one way of doing that would be to buy "gift certificates" at useful online shopping sites, such as amazon.com or thinkgeek.com. Another way would be to sponsor us through a banner-program or even better: by helping us coding, documenting, testing etc. You're welcome to send us a buck using paypal, as described here: http://curl.haxx.se/donation.html 1.7 What about CURL from curl.com? During the summer 2001, curl.com was busy advertising their client-side programming language for the web, named CURL. We are in no way associated with curl.com or their CURL programming language. Our project name curl has been in effective use since 1998. We were not the first computer related project to use the name "curl" and do not claim any first-hand rights to the name. We recognize that we will be living in parallel with curl.com and wish them every success. 1.8 I have a problem who do I mail? Please do not mail any single individual unless you really need to. Keep curl-related questions on a suitable mailing list. All available mailing lists are listed in the MANUAL document and online at http://curl.haxx.se/mail/ Keeping curl-related questions and discussions on mailing lists allows others to join in and help, to share their ideas, contribute their suggestions and spread their wisdom. Keeping discussions on public mailing lists also allows for others to learn from this (both current and future users thanks to the web based archives of the mailing lists), thus saving us from having to repeat ourselves even more. Thanks for respecting this. 2. Install Related Problems 2.1. configure doesn't find OpenSSL even when it is installed This may be because of several reasons. 2.1.1. native linker doesn't find openssl Affected platforms: Solaris (native cc compiler) HPUX (native cc compiler) SGI IRIX (native cc compiler) SCO UNIX (native cc compiler) When configuring curl, I specify --with-ssl. OpenSSL is installed in /usr/local/ssl Configure reports SSL in /usr/local/ssl, but fails to find CRYPTO_lock in -lcrypto Cause: The cc for this test places the -L/usr/local/ssl/lib AFTER -lcrypto, so ld can't find the library. This is due to a bug in the GNU autoconf tool. Workaround: Specifying "LDFLAGS=-L/usr/local/ssl/lib" in front of ./configure places the -L/usr/local/ssl/lib early enough in the command line to make things work Solution submitted by: Bob Allison 2.1.2. only the libssl lib is missing If all include files and the libcrypto lib is present, with only the libssl being missing according to configure, this is mostly likely because a few functions are left out from the libssl. If the function names missing include RSA or RSAREF you can be certain that this is because libssl requires the RSA and RSAREF libs to build. See the INSTALL file section that explains how to add those libs to configure. Make sure that you remove the config.cache file before you rerun configure with the new flags. 2.2. Does curl work/build with other SSL libraries? Curl has been written to use OpenSSL, although there should not be much problems using a different library. If anyone does "port" curl to use a different SSL library, we are of course very interested in getting the patch! 2.3. Where can I find a copy of LIBEAY32.DLL? That is an OpenSSL binary built for Windows. Curl uses OpenSSL to do the SSL stuff. The LIBEAY32.DLL is what curl needs on a windows machine to do https://. Check out the curl web site to find accurate and up-to-date pointers to recent OpenSSL DLLs and other binary packages. 2.4. Does cURL support Socks (RFC 1928) ? There is limited support for SOCKS5 for curl built with IPv6 support disabled. 3. Usage problems 3.1. curl: (1) SSL is disabled, https: not supported If you get this output when trying to get anything from a https:// server, it means that the configure script couldn't find all libs and include files it requires for SSL to work. If the configure script fails to find them, curl is simply built without SSL support. To get the https:// support into a curl that was previously built but that reports that https:// is not supported, you should dig through the document and logs and check out why the configure script doesn't find the SSL libs and/or include files. Also, check out the other paragraph in this FAQ labeled "configure doesn't find OpenSSL even when it is installed". 3.2. How do I tell curl to resume a transfer? Curl supports resumed transfers both ways on both FTP and HTTP. Try the -C option. 3.3. Why doesn't my posting using -F work? You can't simply use -F or -d at your choice. The web server that will receive your post assumes one of the formats. If the form you're trying to "fake" sets the type to 'multipart/form-data', then and only then you must use the -F type. In all the most common cases, you should use -d which then causes a posting with the type 'application/x-www-form-urlencoded'. This is described in some detail in the MANUAL and TheArtOfHttpScripting documents, and if you don't understand it the first time, read it again before you post questions about this to the mailing list. Also, try reading through the mailing list archives for old postings and questions regarding this. 3.4. How do I tell curl to run custom FTP commands? You can tell curl to perform optional commands both before and/or after a file transfer. Study the -Q/--quote option. Since curl is used for file transfers, you don't use curl to just perform FTP commands without transferring anything. Therefore you must always specify a URL to transfer to/from even when doing custom FTP commands. 3.5. How can I disable the Pragma: nocache header? You can change all internally generated headers by adding a replacement with the -H/--header option. By adding a header with empty contents you safely disable that one. Use -H "Pragma:" to disable that specific header. 3.6. Does curl support ASP, XML, XHTML or HTML version Y? To curl, all contents are alike. It doesn't matter how the page was generated. It may be ASP, PHP, Perl, shell-script, SSI or plain HTML-files. There's no difference to curl and it doesn't even know what kind of language that generated the page. See also item 3.14 regarding javascript. 3.7. Can I use curl to delete/rename a file through FTP? Yes. You specify custom FTP commands with -Q/--quote. One example would be to delete a file after you have downloaded it: curl -O ftp://download.com/coolfile -Q '-DELE coolfile' 3.8 How do I tell curl to follow HTTP redirects? Curl does not follow so-called redirects by default. The Location: header that informs the client about this is only interpreted if you're using the -L/--location option. As in: curl -L http://redirector.com 3.9 How do I use curl in my favorite programming language? There exist many language interfaces/bindings for curl that integrates it better with various languages. If you are fluid in a script language, you may very well opt to use such an interface instead of using the command line tool. Find out more about which languages that support curl directly, and how to install and use them, in the libcurl section of the curl web site: http://curl.haxx.se/libcurl/ In February 2003, there are interfaces available for the following languages: Basic, C, C++, Cocoa, Dylan, Euphoria, Java, Lua, Object-Pascal, Pascal, Perl, PHP, PostgreSQL, Python, Rexx, Ruby, Scheme and Tcl. By the time you read this, additional ones may have appeared! 3.10 What about SOAP, WebDAV, XML-RPC or similar protocols over HTTP? Curl adheres to the HTTP spec, which basically means you can play with *any* protocol that is built on top of HTTP. Protocols such as SOAP, WEBDAV and XML-RPC are all such ones. You can use -X to set custom requests and -H to set custom headers (or replace internally generated ones). Using libcurl is of course just as fine and you'd just use the proper library options to do the same. 3.11 How do I POST with a different Content-Type? You can always replace the internally generated headers with -H/--header. To make a simple HTTP POST with text/xml as content-type, do something like: curl -d "datatopost" -H "Content-Type: text/xml" [URL] 3.12 Why do FTP specific features over HTTP proxy fail? Because when you use a HTTP proxy, the protocol spoken on the network will be HTTP, even if you specify a FTP URL. This effectively means that you normally can't use FTP specific features such as FTP upload and FTP quote etc. There is one exception to this rule, and that is if you can "tunnel through" the given HTTP proxy. Proxy tunneling is enabled with a special option (-p) and is generally not available as proxy admins usually disable tunneling to other ports than 443 (which is used for HTTPS access through proxies). 3.13 Why does my single/double quotes fail? To specify a command line option that includes spaces, you might need to put the entire option within quotes. Like in: curl -d " with spaces " url.com or perhaps curl -d ' with spaces ' url.com Exactly what kind of quotes and how to do this is entirely up to the shell or command line interpreter that you are using. For most unix shells, you can more or less pick either single (') or double (") quotes. For Windows/DOS prompts I believe you're forced to use double (") quotes. Please study the documentation for your particular environment. Examples in the curl docs will use a mix of both these ones as shown above. You must adjust them to work in your environment. Remember that curl works and runs on more operating systems than most single individuals have ever tried. 3.14 Does curl support javascript or pac (automated proxy config)? Many web pages do magic stuff using embedded javascript. Curl and libcurl have no built-in support for that, so it will be treated just like any other contents. .pac files are a netscape invention and are sometimes used by organizations to allow them to differentiate which proxies to use. The .pac contents is just a javascript program that gets invoked by the browser and that returns the name of the proxy to connect to. Since curl doesn't support javascript, it can't support .pac proxy configuration either. Some work-arounds usually suggested to overcome this javascript dependency: - Depending on the javascript complexity, write up a script that translates it to another language and execute that. - Read the javascript code and rewrite the same logic in another language. - Implement a javascript interpreted, people have successfully used the Mozilla javascript engine in the past. - Ask your admins to stop this, for a static proxy setup or similar. 4. Running Problems 4.1. Problems connecting to SSL servers. It took a very long time before we could sort out why curl had problems to connect to certain SSL servers when using SSLeay or OpenSSL v0.9+. The error sometimes showed up similar to: 16570:error:1407D071:SSL routines:SSL2_READ:bad mac decode:s2_pkt.c:233: It turned out to be because many older SSL servers don't deal with SSLv3 requests properly. To correct this problem, tell curl to select SSLv2 from the command line (-2/--sslv2). There has also been examples where the remote server didn't like the SSLv2 request and instead you had to force curl to use SSLv3 with -3/--sslv3. 4.2. Why do I get problems when I use & or % in the URL? In general unix shells, the & letter is treated special and when used, it runs the specified command in the background. To safely send the & as a part of a URL, you should quote the entire URL by using single (') or double (") quotes around it. An example that would invoke a remote CGI that uses &-letters could be: curl 'http://www.altavista.com/cgi-bin/query?text=yes&q=curl' In Windows, the standard DOS shell treats the %-letter specially and you need to use TWO %-letters for each single one you want to use in the URL. Also note that if you want the literal %-letter to be part of the data you pass in a POST using -d/--data you must encode it as '%25' (which then also needs the %-letter doubled on Windows machines). 4.3. How can I use {, }, [ or ] to specify multiple URLs? Because those letters have a special meaning to the shell, and to be used in a URL specified to curl you must quote them. An example that downloads two URLs (sequentially) would do: curl '{curl,www}.haxx.se' To be able to use those letters as actual parts of the URL (without using them for the curl URL "globbing" system), use the -g/--globoff option: curl -g 'www.site.com/weirdname[].html' 4.4. Why do I get downloaded data even though the web page doesn't exist? Curl asks remote servers for the page you specify. If the page doesn't exist at the server, the HTTP protocol defines how the server should respond and that means that headers and a "page" will be returned. That's simply how HTTP works. By using the --fail option you can tell curl explicitly to not get any data if the HTTP return code doesn't say success. 4.5 Why do I get return code XXX from a HTTP server? RFC2616 clearly explains the return codes. This is a short transcript. Go read the RFC for exact details: 4.5.1 "400 Bad Request" The request could not be understood by the server due to malformed syntax. The client SHOULD NOT repeat the request without modifications. 4.5.2 "401 Unauthorized" The request requires user authentication. 4.5.3 "403 Forbidden" The server understood the request, but is refusing to fulfill it. Authorization will not help and the request SHOULD NOT be repeated. 4.5.4 "404 Not Found" The server has not found anything matching the Request-URI. No indication is given of whether the condition is temporary or permanent. 4.5.5 "405 Method Not Allowed" The method specified in the Request-Line is not allowed for the resource identified by the Request-URI. The response MUST include an Allow header containing a list of valid methods for the requested resource. 4.5.6 "301 Moved Permanently" If you get this return code and an HTML output similar to this:

Moved Permanently

The document has moved here. it might be because you request a directory URL but without the trailing slash. Try the same operation again _with_ the trailing URL, or use the -L/--location option to follow the redirection. 4.6. Can you tell me what error code 142 means? All error codes that are larger than the highest documented error code means that curl has exited due to a crash. This is a serious error, and we appreciate a detailed bug report from you that describes how we could go ahead and repeat this! 4.7. How do I keep user names and passwords secret in Curl command lines? This problem has two sides: The first part is to avoid having clear-text passwords in the command line so that they don't appear in 'ps' outputs and similar. That is easily avoided by using the "-K" option to tell curl to read parameters from a file or stdin to which you can pass the secret info. To keep the passwords in your account secret from the rest of the world is not a task that curl addresses. You could of course encrypt them somehow to at least hide them from being read by human eyes, but that is not what anyone would call security. Also note that regular HTTP and FTP passwords are sent in clear across the network. All it takes for anyone to fetch them is to listen on the network. Eavesdropping is very easy. 4.8 I found a bug! It is not a bug if the behavior is documented. Read the docs first. If it is a problem with a binary you've downloaded or a package for your particular platform, try contacting the person who built the package/archive you have. If there is a bug, read the BUGS document first. Then report it as described in there. 4.9. Curl can't authenticate to the server that requires NTLM? This is supported in curl 7.10.6 or later. No earlier curl version knows of this magic. NTLM is a Microsoft proprietary protocol. Proprietary formats are evil. You should not use such ones. 4.10 My HTTP request using HEAD, PUT or DELETE doesn't work! Many web servers allow or demand that the administrator configures the server properly for these requests to work on the web server. Some servers seem to support HEAD only on certain kinds of URLs. To fully grasp this, try the documentation for the particular server software you're trying to interact with. This is not anything curl can do anything about. 4.11 Why does my HTTP range requests return the full document? Because the range may not be supported by the server, or the server may choose to ignore it and return the full document anyway. 4.12 Why do I get "certificate verify failed" ? You invoke curl 7.10 or later to communicate on a https:// URL and get an error back looking something similar to this: curl: (35) SSL: error:14090086:SSL routines: SSL3_GET_SERVER_CERTIFICATE:certificate verify failed Then it means that curl couldn't verify that the server's certificate was good. Curl verifies the certificate using the CA cert bundle that comes with the curl installation. To disable the verification (which makes it act like curl did before 7.10), use -k. This does however enable man-in-the-middle attacks. If you get this failure but are having a CA cert bundle installed and used, the server's certificate is not signed by one of the CA's in the bundle. It might for example be self-signed. You then correct this problem by obtaining a valid CA cert for the server. Or again, decrease the security by disabling this check. Details are also in the SSLCERTS file in the release archives, found online here: http://curl.haxx.se/docs/sslcerts.html 5. libcurl Issues 5.1. Is libcurl thread-safe? Yes. We have written the libcurl code specificly adjusted for multi-threaded programs. libcurl will use thread-safe functions instead of non-safe ones if your system has such. We would appreciate some kind of report or README file from those who have used libcurl in a threaded environment. 5.2 How can I receive all data into a large memory chunk? [ See also the examples/getinmemory.c source ] You are in full control of the callback function that gets called every time there is data received from the remote server. You can make that callback do whatever you want. You do not have to write the received data to a file. One solution to this problem could be to have a pointer to a struct that you pass to the callback function. You set the pointer using the curl_easy_setopt(CURLOPT_FILE) function. Then that pointer will be passed to the callback instead of a FILE * to a file: /* imaginary struct */ struct MemoryStruct { char *memory; size_t size; }; /* imaginary callback function */ size_t WriteMemoryCallback(void *ptr, size_t size, size_t nmemb, void *data) { register int realsize = size * nmemb; struct MemoryStruct *mem = (struct MemoryStruct *)data; mem->memory = (char *)realloc(mem->memory, mem->size + realsize + 1); if (mem->memory) { memcpy(&(mem->memory[mem->size]), ptr, realsize); mem->size += realsize; mem->memory[mem->size] = 0; } return realsize; } 5.3 How do I fetch multiple files with libcurl? libcurl has excellent support for transferring multiple files. You should just repeatedly set new URLs with curl_easy_setopt() and then transfer it with curl_easy_perform(). The handle you get from curl_easy_init() is not only reusable, but you're even encouraged to reuse it if you can, as that will enable libcurl to use persistent connections. 5.4 Does libcurl do Winsock initialization on win32 systems? Yes, if told to in the curl_global_init() call. 5.5 Does CURLOPT_FILE and CURLOPT_INFILE work on win32 ? Yes, but you cannot open a FILE * and pass the pointer to a DLL and have that DLL use the FILE *. If you set CURLOPT_FILE you must also use CURLOPT_WRITEFUNCTION as well to set a function that writes the file, even if that simply writes the data to the specified FILE*. Similarly, if you use CURLOPT_INFILE you must also specify CURLOPT_READFUNCTION. (Provided by Joel DeYoung and Bob Schader) 5.6 What about Keep-Alive or persistent connections? curl and libcurl have excellent support for persistent connections when transferring several files from the same server. Curl will attempt to reuse connections for all URLs specified on the same command line/config file, and libcurl will reuse connections for all transfers that are made using the same libcurl handle. 5.7 Link errors when building libcurl on Windows! You need to make sure that your project, and all the libraries (both static and dynamic) that it links against, are compiled/linked against the same run time library. This is determined by the /MD, /ML, /MT (and their corresponding /M?d) options to the command line compiler. /MD (linking against MSVCRT dll) seems to be the most commonly used option. (Provided by Andrew Francis) 6. License Issues Curl and libcurl are released under a MIT/X derivate license. The license is very liberal and should not impose a problem for your project. This section is just a brief summary for the cases we get the most questions. (Parts of this section was much enhanced by Bjorn Reese.) 6.1. I have a GPL program, can I use the libcurl library? Yes! Since libcurl may be distributed under the MIT/X derivate license, it can be used together with GPL in any software. 6.2. I have a closed-source program, can I use the libcurl library? Yes! libcurl does not put any restrictions on the program that uses the library. 6.3. I have a BSD licensed program, can I use the libcurl library? Yes! libcurl does not put any restrictions on the program that uses the library. 6.4. I have a program that uses LGPL libraries, can I use libcurl? Yes! The LGPL license doesn't clash with other licenses. 6.5. Can I modify curl/libcurl for my program and keep the changes secret? Yes! The MIT/X derivate license practically allows you to do almost anything with the sources, on the condition that the copyright texts in the sources are left intact. 6.6. Can you please change the curl/libcurl license to XXXX? No. We have carefully picked this license after years of development and discussions and a large amount of people have contributed with source code knowing that this is the license we use. This license puts the restrictions we want on curl/libcurl and it does not spread to other programs or libraries that use it. It should be possible for everyone to use libcurl or curl in their projects, no matter what license they already have in use. twittering-mode-3.1.0/win-curl/docs/COPYING0000664000175000017500000000202412772521564020207 0ustar tadashitadashiCOPYRIGHT AND PERMISSION NOTICE Copyright (c) 1996 - 2003, Daniel Stenberg, . All rights reserved. Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of a copyright holder shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization of the copyright holder. twittering-mode-3.1.0/win-curl/docs/FEATURES0000664000175000017500000000541512772521564020324 0ustar tadashitadashi _ _ ____ _ ___| | | | _ \| | / __| | | | |_) | | | (__| |_| | _ <| |___ \___|\___/|_| \_\_____| FEATURES Misc - full URL syntax - custom maximum download time - custom least download speed acceptable - custom output result after completion - multiple URLs - guesses protocol from host name unless specified - uses .netrc - progress bar/time specs while downloading - "standard" proxy environment variables support - config file support - compiles on win32 (reported builds on 40+ operating systems) - redirectable stderr - selectable network interface for outgoing traffic - IPv6 support - persistant connections - socks5 support - supports user name + password in proxy environment variables - operations through proxy "tunnel" (using CONNECT) HTTP - HTTP/1.1 compliant (optionally uses 1.0) - GET - PUT - HEAD - POST - multipart formpost (RFC1867-style) - authentication: Basic, Digest, NTLM(*1), GSS-Negotiate/Negotiate(*3) and SPNEGO (*4) - resume (both GET and PUT) - follow redirects - maximum amount of redirects to follow - custom HTTP request - cookie get/send fully parsed - reads/writes the netscape cookie file format - custom headers (replace/remove internally generated headers) - custom user-agent string - custom referer string - range - proxy authentication - time conditions - via http-proxy - retrieve file modification date - Content-Encoding support for deflate and gzip - "Transfer-Encoding: chunked" support for "uploads" HTTPS (*1) - (all the HTTP features) - using certificates - verify server certificate - via http-proxy - select desired encryption - force usage of a specific SSL version (SSLv2, SSLv3 or TLSv1) FTP - download - authentication - kerberos4 (*5) - active/passive using PORT, EPRT, PASV or EPSV - single file size information (compare to HTTP HEAD) - 'type=' URL support - dir listing - dir listing names-only - upload - upload append - upload via http-proxy as HTTP PUT - download resume - upload resume - custom ftp commands (before and/or after the transfer) - simple "range" support - via http-proxy - all operations can be tunneled through a http-proxy - customizable to retrieve file modification date TELNET - connection negotiation - custom telnet options - stdin/stdout I/O LDAP (*2) - full LDAP URL support DICT - extended DICT URL support GOPHER - GET - via http-proxy FILE - URL support FOOTNOTES ========= *1 = requires OpenSSL *2 = requires OpenLDAP *3 = requires a GSSAPI-compliant library, such as Heimdal or similar. *4 = requires FBopenssl *5 = requires a krb4 library, such as the MIT one or similar. twittering-mode-3.1.0/win-curl/docs/curl.html0000664000175000017500000016305112772521564021017 0ustar tadashitadashi

       curl - transfer a URL


SYNOPSIS

       curl [options] [URL...]


DESCRIPTION

       curl is a tool to transfer data from or to a server, using
       one of the supported protocols (HTTP,  HTTPS,  FTP,  FTPS,
       GOPHER,  DICT,  TELNET,  LDAP  or  FILE).  The  command is
       designed to work without user interaction.

       curl offers a busload of useful tricks like proxy support,
       user  authentication,  ftp upload, HTTP post, SSL (https:)
       connections, cookies, file transfer resume  and  more.  As
       you  will see below, the amount of features will make your
       head spin!

       curl is powered by libcurl for all  transfer-related  fea-
       tures. See libcurl(3) for details.


URL

       The  URL  syntax  is  protocol  dependent.  You'll  find a
       detailed description in RFC 2396.

       You can specify multiple URLs or parts of URLs by  writing
       part sets within braces as in:

        http://site.{one,two,three}.com

       or  you  can get sequences of alphanumeric series by using
       [] as in:

        ftp://ftp.numericals.com/file[1-100].txt
        ftp://ftp.numericals.com/file[001-100].txt    (with lead-
       ing zeros)
        ftp://ftp.letters.com/file[a-z].txt

       No nesting of the sequences is supported at the moment:

        http://www.any.org/archive[1996-1999]/vol-
       ume[1-4]part{a,b,c,index}.html

       You can specify any amount of URLs on  the  command  line.
       They  will be fetched in a sequential manner in the speci-
       fied order.

       Curl will attempt to re-use connections for multiple  file
       transfers, so that getting many files from the same server
       will not do multiple connects / handshakes. This  improves
       speed. Of course this is only done on files specified on a
       single command line and cannot be  used  between  separate
       curl invokes.
       -a/--append
              (FTP)  When  used  in an FTP upload, this will tell
              curl to append to the target file instead of  over-
              writing  it.  If the file doesn't exist, it will be
              created.

              If this option is used twice, the second  one  will
              disable append mode again.

       -A/--user-agent <agent string>
              (HTTP) Specify the User-Agent string to send to the
              HTTP server. Some badly done CGIs fail if  its  not
              set  to  "Mozilla/4.0".   To  encode  blanks in the
              string,  surround  the  string  with  single  quote
              marks.   This  can also be set with the -H/--header
              flag of course.

              If this option is set more than once, the last  one
              will be the one that's used.

       --anyauth
              (HTTP)  Tells  curl  to  figure  out authentication
              method by itself, and use the most secure  one  the
              remote  site  claims  it  supports. This is done by
              first doing a request and  checking  the  response-
              headers, thus inducing an extra network round-trip.
              This is used instead of setting a specific  authen-
              tication  method,  which  you can do with --digest,
              --ntlm, and --negotiate. (Added in 7.10.6)

              If this option is used several times, the following
              occurrences make no difference.

       -b/--cookie <name=data>
              (HTTP)  Pass  the  data  to  the  HTTP  server as a
              cookie.  It  is  supposedly  the  data   previously
              received  from  the server in a "Set-Cookie:" line.
              The data should be  in  the  format  "NAME1=VALUE1;
              NAME2=VALUE2".

              If no '=' letter is used in the line, it is treated
              as a filename to  use  to  read  previously  stored
              cookie  lines  from,  which  should be used in this
              session if they match. Using this method also acti-
              vates  the  "cookie  parser"  which  will make curl
              record incoming cookies too, which may be handy  if
              you're   using   this   in   combination  with  the
              -L/--location option. The file format of  the  file
              to  read  cookies from should be plain HTTP headers
              or the Netscape/Mozilla cookie file format.

              NOTE that the file specified  with  -b/--cookie  is
              option or you could even save the HTTP headers to a
              file using -D/--dump-header!

              If this option is set more than once, the last  one
              will be the one that's used.

       -B/--use-ascii
              Use ASCII transfer when getting an FTP file or LDAP
              info. For FTP, this can also be enforced  by  using
              an URL that ends with ";type=A". This option causes
              data sent to stdout to be in text  mode  for  win32
              systems.

              If  this  option is used twice, the second one will
              disable ASCII usage.

       --basic
              (HTTP) Tells curl to use HTTP Basic authentication.
              This  is  the  default  and  this option is usually
              pointless, unless you use it to override  a  previ-
              ously  set option that sets a different authentica-
              tion method (such as --ntlm, --digest and --negoti-
              ate). (Added in 7.10.6)

              If this option is used several times, the following
              occurrences make no difference.

       --ciphers <list of ciphers>
              (SSL) Specifies which ciphers to use in the connec-
              tion.  The  list  of  ciphers  must  be using valid
              ciphers. Read up on SSL cipher list details on this
              URL: http://www.openssl.org/docs/apps/ciphers.html

              If  this option is used several times, the last one
              will override the others.

       --compressed
              (HTTP) Request a compressed response using  one  of
              the  algorithms  libcurl  supports,  and return the
              uncompressed document.  If this option is used  and
              the server sends an unsupported encoding, Curl will
              report an error.

              If this option is used several times,  each  occur-
              rence will toggle it on/off.

       --connect-timeout <seconds>
              Maximum  time in seconds that you allow the connec-
              tion to the server to take.  This only  limits  the
              connection  phase,  once  curl  has  connected this
              option is of no more use. See also  the  --max-time
              option.
              will be used.

       -c/--cookie-jar <file name>
              Specify to which file you want curl  to  write  all
              cookies  after  a  completed operation. Curl writes
              all cookies previously read from a  specified  file
              as   well  as  all  cookies  received  from  remote
              server(s). If no cookies are known, no file will be
              written.   The  file  will  be  written  using  the
              Netscape cookie file format. If you  set  the  file
              name  to  a  single  dash, "-", the cookies will be
              written to stdout.

              NOTE If the cookie jar can't be created or  written
              to,  the  whole  curl  operation won't fail or even
              report an error clearly. Using -v will get a  warn-
              ing  displayed,  but that is the only visible feed-
              back you get about this possibly lethal  situation.

              If  this  option  is  used  several times, the last
              specfied file name will be used.

       -C/--continue-at <offset>
              Continue/Resume a previous  file  transfer  at  the
              given  offset. The given offset is the exact number
              of bytes that will  be  skipped  counted  from  the
              beginning  of  the  source file before it is trans-
              fered to the destination.  If  used  with  uploads,
              the  ftp  server  command  SIZE will not be used by
              curl.

              Use "-C -" to tell curl to automatically  find  out
              where/how  to resume the transfer. It then uses the
              given output/input files to figure that out.

              If this option is used several times, the last  one
              will be used.

       --create-dirs
              When  used  in conjunction with the -o option, curl
              will create the necessary local directory hierarchy
              as needed.

       --crlf (FTP)  Convert LF to CRLF in upload. Useful for MVS
              (OS/390).

              If this option is used twice, the second will again
              disable crlf converting.

       -d/--data <data>
              (HTTP)  Sends  the specified data in a POST request
              to the HTTP server, in a way that can emulate as if
              as  specified  with  no  extra processing (with all
              newlines cut off).  The  data  is  expected  to  be
              "url-encoded".  This  will  cause  curl to pass the
              data to the server using the content-type  applica-
              tion/x-www-form-urlencoded.  Compare to -F. If more
              than one -d/--data option is used on the same  com-
              mand line, the data pieces specified will be merged
              together with a separating  &-letter.  Thus,  using
              '-d  name=daniel  -d  skill=lousy' would generate a
              post       chunk       that       looks        like
              'name=daniel&skill=lousy'.

              If  you  start the data with the letter @, the rest
              should be a file name to read the data from,  or  -
              if  you want curl to read the data from stdin.  The
              contents of the file must already  be  url-encoded.
              Multiple  files can also be specified. Posting data
              from a file named 'foobar' would thus be done  with
              "--data @foobar".

              To  post data purely binary, you should instead use
              the --data-binary option.

              -d/--data is the same as --data-ascii.

              If this option is used several times, the ones fol-
              lowing the first will append data.

       --data-ascii <data>
              (HTTP) This is an alias for the -d/--data option.

              If this option is used several times, the ones fol-
              lowing the first will append data.

       --data-binary <data>
              (HTTP) This posts  data  in  a  similar  manner  as
              --data-ascii  does, although when using this option
              the entire context of the posted data is  kept  as-
              is.  If  you want to post a binary file without the
              strip-newlines feature of the --data-ascii  option,
              this is for you.

              If this option is used several times, the ones fol-
              lowing the first will append data.

       --digest
              (HTTP) Enables HTTP Digest authentication. This  is
              a  authentication  that  prevents the password from
              being sent over the wire in clear text. Use this in
              combination with the normal -u/--user option to set
              user name and password. See also --ntlm,  --negoti-
              ate  and  --anyauth  for related options. (Added in
              occurrences make no difference.

       --disable-eprt
              (FTP)  Tell curl to disable the use of the EPRT and
              LPRT commands when doing active FTP transfers. Curl
              will  normally  always  first  attempt to use EPRT,
              then LPRT before using PORT, but with this  option,
              it  will  use  PORT  right  away. EPRT and LPRT are
              extensions to the original FTP  protocol,  may  not
              work  on  all servers but enable more functionality
              in a better way than the traditional PORT  command.
              (Aded in 7.10.5)

              If  this  option is used several times, each occur-
              rence will toggle this on/off.

       --disable-epsv
              (FTP) Tell curl to disable the use of the EPSV com-
              mand  when  doing  passive FTP transfers. Curl will
              normally always first attempt to  use  EPSV  before
              PASV,  but  with this option, it will not try using
              EPSV.

              If this option is used several times,  each  occur-
              rence will toggle this on/off.

       -D/--dump-header <file>
              Write the protocol headers to the specified file.

              This  option is handy to use when you want to store
              the headers that a HTTP site sends to you.  Cookies
              from  the  headers  could  then be read in a second
              curl invoke by using the  -b/--cookie  option!  The
              -c/--cookie-jar  option  is however a better way to
              store cookies.

              When used on FTP, the ftp server response lines are
              considered  being  "headers"  and  thus  are  saved
              there.

              If this option is used several times, the last  one
              will be used.

       -e/--referer <URL>
              (HTTP)  Sends the "Referer Page" information to the
              HTTP  server.  This  can  also  be  set  with   the
              -H/--header   flag   of  course.   When  used  with
              -L/--location you can append ";auto" to the referer
              URL to make curl automatically set the previous URL
              when it follows a  Location:  header.  The  ";auto"
              string  can be used alone, even if you don't set an
              initial referer.
              will be used.

       --environment
              (RISC  OS  ONLY)  Sets a range of environment vari-
              ables, using the names the -w option  supports,  to
              easier allow extraction of useful information after
              having run curl.

              If this option is used several times,  each  occur-
              rence will toggle this on/off.

       --egd-file <file>
              (HTTPS)  Specify the path name to the Entropy Gath-
              ering Daemon socket. The socket is used to seed the
              random  engine  for  SSL  connections. See also the
              --random-file option.

       -E/--cert <certificate[:password]>
              (HTTPS) Tells curl to use the specified certificate
              file  when  getting a file with HTTPS. The certifi-
              cate must be in PEM format.  If the optional  pass-
              word isn't specified, it will be queried for on the
              terminal. Note that this certificate is the private
              key and the private certificate concatenated!

              If  this option is used several times, the last one
              will be used.

       --cacert <CA certificate>
              (HTTPS) Tells curl to use the specified certificate
              file  to verify the peer. The file may contain mul-
              tiple CA certificates. The certificate(s)  must  be
              in PEM format.

              curl  recognizes  the  environment  variable  named
              'CURL_CA_BUNDLE' if that is set, and uses the given
              path  as  a  path  to a CA cert bundle. This option
              overrides that variable.

              The windows version of curl will automatically look
              for  a  CA  certs  file named 'curl-ca-bundle.crt',
              either in the same directory as curl.exe, or in the
              Current  Working  Directory, or in any folder along
              your PATH.

              If this option is used several times, the last  one
              will be used.

       --capath <CA certificate directory>
              (HTTPS) Tells curl to use the specified certificate
              directory to verify the peer. The certificates must
              be  in PEM format, and the directory must have been
              https connections much more efficiently than  using
              --cacert if the --cacert file contains many CA cer-
              tificates.

              If this option is used several times, the last  one
              will be used.

       -f/--fail
              (HTTP)  Fail  silently (no output at all) on server
              errors. This is mostly done  like  this  to  better
              enable  scripts  etc  to  better  deal  with failed
              attempts. In normal cases when a HTTP server  fails
              to  deliver  a document, it returns a HTML document
              stating so (which  often  also  describes  why  and
              more).  This flag will prevent curl from outputting
              that and fail silently instead.

              If this option is used twice, the second will again
              disable silent failure.

       --ftp-create-dirs
              (FTP)  When  an  FTP URL/operation uses a path that
              doesn't currently exist on the server, the standard
              behaviour  of  curl  is to fail. Using this option,
              curl will instead attempt to create missing  direc-
              tories. (Added in 7.10.7)

              If this option is used twice, the second will again
              disable silent failure.

       -F/--form <name=content>
              (HTTP) This lets curl emulate a filled in  form  in
              which  a  user  has pressed the submit button. This
              causes curl to POST  data  using  the  content-type
              multipart/form-data   according  to  RFC1867.  This
              enables uploading of binary files etc. To force the
              'content'  part  to  be  be a file, prefix the file
              name with an @ sign. To just get the  content  part
              from  a  file, prefix the file name with the letter
              <. The difference between @ and < is  then  that  @
              makes  a  file  get  attached in the post as a file
              upload, while the < makes a text field and just get
              the contents for that text field from a file.

              Example,  to send your password file to the server,
              where 'password' is the name of the  form-field  to
              which /etc/passwd will be the input:

              curl -F password=@/etc/passwd www.mypasswords.com

              To  read  the file's content from stdin insted of a
              file, use - where the  file  name  should've  been.
              the file upload part, by using 'type=', in a manner
              similar to:

              curl -F "web=@index.html;type=text/html" url.com

              See further examples and details in the MANUAL.

              This option can be used multiple times.

       -g/--globoff
              This option switches off the "URL globbing parser".
              When you set this option, you can specify URLs that
              contain  the letters {}[] without having them being
              interpreted by curl itself. Note that these letters
              are  not  normal legal URL contents but they should
              be encoded according to the URI standard.

       -G/--get
              When used, this option will make all data specified
              with  -d/--data  or  --data-binary  to be used in a
              HTTP GET request instead of the POST  request  that
              otherwise  would be used. The data will be appended
              to the URL with a '?'  separator.

              If used in combination with -I, the POST data  will
              instead be appended to the URL with a HEAD request.

              If used multiple times, nothing special happens.

       -h/--help
              Usage help.

       -H/--header <header>
              (HTTP) Extra header to use when getting a web page.
              You  may  specify any number of extra headers. Note
              that if you should add a custom header that has the
              same  name  as  one of the internal ones curl would
              use,  your  externally  set  header  will  be  used
              instead  of  the  internal  one. This allows you to
              make even trickier stuff than curl  would  normally
              do.  You  should not replace internally set headers
              without knowing perfectly well what  you're  doing.
              Replacing  an internal header with one without con-
              tent on the right side of the  colon  will  prevent
              that header from appearing.

              This   option   can   be  used  multiple  times  to
              add/replace/remove multiple headers.

       -i/--include
              (HTTP) Include the HTTP-header in the  output.  The
              HTTP-header  includes things like server-name, date
              disable header include.

       --interface <name>
              Perform  an  operation using a specified interface.
              You can enter interface name, IP  address  or  host
              name. An example could look like:

              curl --interface eth0:1 http://www.netscape.com/

              If  this option is used several times, the last one
              will be used.

       -I/--head
              (HTTP/FTP/FILE) Fetch the HTTP-header  only!  HTTP-
              servers feature the command HEAD which this uses to
              get nothing but the header of a document. When used
              on  a FTP or FILE file, curl displays the file size
              and last modification time only.

              If this option is used twice, the second will again
              disable header only.

       -j/--junk-session-cookies
              (HTTP)  When  curl  is  told to read cookies from a
              given file, this option will make  it  discard  all
              "session  cookies". This will basicly have the same
              effect as if a  new  session  is  started.  Typical
              browsers   always   discard  session  cookies  when
              they're closed down. (Added in 7.9.7)

              If this option is used several times,  each  occur-
              rence will toggle this on/off.

       -k/--insecure
              (SSL) This option explicitly allows curl to perform
              "insecure" SSL connections and transfers.  Starting
              with   curl  7.10,  all  SSL  connections  will  be
              attempted to be made secure by using  the  CA  cer-
              tificate  bundle  installed  by default. This makes
              all  connections  considered  "insecure"  to   fail
              unless -k/--insecure is used.

              This  option  is ignored if --cacert or --capath is
              used!

              If this option is used twice, the second time  will
              again disable it.

       --krb4 <level>
              (FTP)  Enable kerberos4 authentication and use. The
              level must be entered and should be one of 'clear',
              'safe', 'confidential' or 'private'. Should you use

              If  this option is used several times, the last one
              will be used.

       -K/--config <config file>
              Specify which config file to  read  curl  arguments
              from.  The config file is a text file in which com-
              mand line arguments can be written which then  will
              be  used as if they were written on the actual com-
              mand line. Options and  their  parameters  must  be
              specified  on  the  same  config  file line. If the
              parameter is to contain white spaces, the parameter
              must  be inclosed within quotes.  If the first col-
              umn of a config line is a '#' character,  the  rest
              of the line will be treated as a comment.

              Specify  the  filename as '-' to make curl read the
              file from stdin.

              Note that to be able to specify a URL in the config
              file,  you  need  to  specify  it  using  the --url
              option, and not by simply writing the  URL  on  its
              own line. So, it could look similar to this:

              url = "http://curl.haxx.se/docs/"

              This option can be used multiple times.

       --limit-rate <speed>
              Specify  the maximum transfer rate you want curl to
              use. This feature is useful if you have  a  limited
              pipe  and  you'd  like  your  transfer not use your
              entire bandwidth.

              The given speed is measured in bytes/second, unless
              a  suffix  is  appended.  Appending 'k' or 'K' will
              count the number as kilobytes, 'm' or M'  makes  it
              megabytes  while  'g'  or  'G'  makes it gigabytes.
              Examples: 200K, 3m and 1G.

              This option was introduced in curl 7.10.

              If this option is used several times, the last  one
              will be used.

       -l/--list-only
              (FTP)  When  listing  an FTP directory, this switch
              forces a name-only view.  Especially useful if  you
              want to machine-parse the contents of an FTP direc-
              tory since the normal directory view doesn't use  a
              standard look or format.

              to  NLST;  they  do  not include subdirectories and
              symbolic links.

              If this option is used twice, the second will again
              disable list only.

       -L/--location
              (HTTP/HTTPS)   If   the  server  reports  that  the
              requested page has a different location  (indicated
              with  the header line Location:) this flag will let
              curl attempt to reattempt the get on the new place.
              If  used  together  with -i or -I, headers from all
              requested pages will be shown. If authentication is
              used,  curl  will  only send its credentials to the
              initial host, so if a redirect takes curl to a dif-
              ferent  host, it won't intercept the user+password.
              See also --location-trusted on how to change  this.

              If this option is used twice, the second will again
              disable location following.

       --location-trusted
              (HTTP/HTTPS) Like --location, but will allow  send-
              ing  the name + password to all hosts that the site
              may redirect to. This may or may  not  introduce  a
              security breach if the site redirects you do a site
              to  which  you'll  send  your  authentication  info
              (which  is  plaintext  in  the  case  of HTTP Basic
              authentication).

              If this option is used twice, the second will again
              disable location following.

       --max-filesize <bytes>
              Specify  the  maximum  size (in bytes) of a file to
              download. If the file requested is larger than this
              value,  the  transfer  will not start and curl will
              return with exit code 63.

              NOTE: The file size is not always  known  prior  to
              download,  and  for  such  files this option has no
              effect even if the  file  transfer  ends  up  being
              larger  than  this  given limit. This concerns both
              FTP and HTTP transfers.

       -m/--max-time <seconds>
              Maximum time in seconds that you  allow  the  whole
              operation  to  take.  This is useful for preventing
              your batch jobs from hanging for hours due to  slow
              networks  or  links  going down.  This doesn't work
              fully in win32 systems.  See  also  the  --connect-
              timeout option.
              will be used.

       -M/--manual
              Manual. Display the huge help text.

       -n/--netrc
              Makes curl scan the .netrc file in the user's  home
              directory for login name and password. This is typ-
              ically used for ftp on unix.  If  used  with  http,
              curl  will enable user authentication. See netrc(4)
              or ftp(1) for details on the file format. Curl will
              not  complain if that file hasn't the right permis-
              sions (it should not be world nor group  readable).
              The environment variable "HOME" is used to find the
              home directory.

              A quick and very simple example of how to  setup  a
              .netrc   to  allow  curl  to  ftp  to  the  machine
              host.domain.com with user name 'myself'  and  pass-
              word 'secret' should look similar to:

              machine   host.domain.com   login  myself  password
              secret

              If this option is used twice, the second will again
              disable netrc usage.

       --negotiate
              (HTTP)  Enables  GSS-Negotiate  authentication. The
              GSS-Negotiate method was designed by Microsoft  and
              is  used  in their web aplications. It is primarily
              meant as a support for Kerberos5 authentication but
              may  be also used along with another authentication
              methods. For more information see IETF draft draft-
              brezak-spnego-http-04.txt. (Added in 7.10.6)

              NOTE  that  this  option requiures that the library
              was built with GSSAPI support.  This  is  not  very
              common.  Use  curl --version to see if your version
              supports GSS-Negotiate.

              If this option is used several times, the following
              occurrences make no difference.

       -N/--no-buffer
              Disables  the  buffering  of  the output stream. In
              normal work situations, curl will  use  a  standard
              buffered  output  stream  that will have the effect
              that it will output the data in chunks, not  neces-
              sarily  exactly  when the data arrives.  Using this
              option will disable that buffering.


       --ntlm (HTTP)   Enables   NTLM  authentication.  The  NTLM
              authentication method was designed by Microsoft and
              is  used  by  IIS  web servers. It is a proprietary
              protocol, reversed engineered by clever people  and
              implemented  in  curl  based on their efforts. This
              kind of behavior should not be endorsed, you should
              encourage  everyone  who  uses  NTLM to switch to a
              public   and   documented   authentication   method
              instead. Such as Digest. (Added in 7.10.6)

              NOTE  that  this  option requiures that the library
              was built with SSL support. Use curl  --version  to
              see if your version supports NTLM.

              If this option is used several times, the following
              occurrences make no difference.

       -o/--output <file>
              Write output to <file> instead of  stdout.  If  you
              are using {} or [] to fetch multiple documents, you
              can use '#' followed by  a  number  in  the  <file>
              specifier.  That variable will be replaced with the
              current string for the URL being fetched. Like in:

                curl http://{one,two}.site.com -o "file_#1.txt"

              or use several variables like:

                curl http://{site,host}.host[1-5].com -o "#1_#2"

              You may use this option as many times as  you  have
              number of URLs.

              See  also  the  --create-dirs  option to create the
              local directories dynamically.

       -O/--remote-name
              Write output to a local file named like the  remote
              file we get. (Only the file part of the remote file
              is used, the path is cut off.)

              You may use this option as many times as  you  have
              number of URLs.

       -p/--proxytunnel
              When  an HTTP proxy is used, this option will cause
              non-HTTP protocols to attempt to tunnel through the
              proxy  instead  of  merely using it to do HTTP-like
              operations. The tunnel approach is  made  with  the
              HTTP  proxy  CONNECT  request and requires that the
              proxy allows direct connect to the remote port num-
              disable proxy tunnel.

       -P/--ftpport <address>
              (FTP) Reverses the  initiator/listener  roles  when
              connecting with ftp. This switch makes Curl use the
              PORT command instead of  PASV.  In  practice,  PORT
              tells  the server to connect to the client's speci-
              fied address and port, while PASV asks  the  server
              for an ip address and port to connect to. <address>
              should be one of:

              interface   i.e "eth0" to specify which interface's
                          IP address you want to use  (Unix only)

              IP address  i.e "192.168.10.1" to specify exact  IP
                          number

              host name   i.e "my.host.domain" to specify machine

              -           (any single-letter string) to  make  it
                          pick the machine's default

       If this option is used several times, the last one will be
       used.

       -q     If used as the first parameter on the command line,
              the $HOME/.curlrc file will not be read and used as
              a config file.

       -Q/--quote <comand>
              (FTP) Send an arbitrary command to the  remote  FTP
              server,  by  using the QUOTE command of the server.
              Not all servers support this command, and  the  set
              of  QUOTE  commands are server specific! Quote com-
              mands are sent BEFORE the transfer is taking place.
              To  make  commands  take  place  after a successful
              transfer, prefix them with  a  dash  '-'.  You  may
              specify any amount of commands to be run before and
              after the transfer. If the server  returns  failure
              for  one of the commands, the entire operation will
              be aborted.

              This option can be used multiple times.

       --random-file <file>
              (HTTPS) Specify the path name  to  file  containing
              what will be considered as random data. The data is
              used to seed the random engine for SSL connections.
              See also the --edg-file option.

       -r/--range <range>
              (HTTP/FTP)  Retrieve  a  byte  range (i.e a partial

              0-499     specifies the first 500 bytes

              500-999   specifies the second 500 bytes

              -500      specifies the last 500 bytes

              9500      specifies  the bytes from offset 9500 and
                        forward

              0-0,-1    specifies  the  first   and   last   byte
                        only(*)(H)

              500-700,600-799
                        specifies 300 bytes from offset 500(H)

              100-199,500-599
                        specifies    two   separate   100   bytes
                        ranges(*)(H)

       (*) = NOTE that this will cause the server to reply with a
       multipart response!

       You should also be aware that many HTTP/1.1 servers do not
       have this feature enabled, so that when you attempt to get
       a range, you'll instead get the whole document.

       FTP range downloads only support the simple syntax 'start-
       stop' (optionally with one of  the  numbers  omitted).  It
       depends on the non-RFC command SIZE.

       If this option is used several times, the last one will be
       used.

       -R/--remote-time
              When used, this will make libcurl attempt to figure
              out  the  timestamp of the remote file, and if that
              is available make the  local  file  get  that  same
              timestamp.

              If  this option is used twice, the second time dis-
              ables this again.

       -s/--silent
              Silent mode. Don't show  progress  meter  or  error
              messages.  Makes Curl mute.

              If this option is used twice, the second will again
              disable mute.

       -S/--show-error
              When used with -s it makes curl show error  message
              disable show error.

       --stderr <file>
              Redirect all writes to stderr to the specified file
              instead.  If  the  file  name is a plain '-', it is
              instead written to stdout. This option has no point
              when  you're  using a shell with decent redirecting
              capabilities.

              If this option is used several times, the last  one
              will be used.

       -t/--telnet-option <OPT=val>
              Pass  options  to  the  telnet  protocol. Supported
              options are:

              TTYPE=<term> Sets the terminal type.

              XDISPLOC=<X display> Sets the X display location.

              NEW_ENV=<var,val> Sets an environment variable.

       -T/--upload-file <file>
              This transfers the  specified  local  file  to  the
              remote  URL. If there is no file part in the speci-
              fied URL, Curl will append  the  local  file  name.
              NOTE  that  you  must  use a trailing / on the last
              directory to really prove to Curl that there is  no
              file  name or curl will think that your last direc-
              tory name is the remote file name to use. That will
              most  likely cause the upload operation to fail. If
              this is used on a http(s) server, the  PUT  command
              will be used.

              Use  the file name "-" (a single dash) to use stdin
              instead of a given file.

              Before 7.10.8, when this option  was  used  several
              times, the last one was used.

              In  curl  7.10.8  and later, you can specify one -T
              for each URL on the command line.  Each  -T  +  URL
              pair  specifies  what  to upload and to where. curl
              also supports "globbing" of the -T argument,  mean-
              ing  that you can upload multiple files to a single
              URL by using the same URL globbing style  supported
              in the URL, like this:

              curl    -T    "{file1,file2}"    http://www.upload-
              tothissite.com

              or even
              nia.com/upload/

       --trace <file>
              Enables  a full trace dump of all incoming and out-
              going data, including descriptive  information,  to
              the  given output file. Use "-" as filename to have
              the output sent to stdout.

              If this option is used several times, the last  one
              will be used. (Added in 7.9.7)

       --trace-ascii <file>
              Enables  a full trace dump of all incoming and out-
              going data, including descriptive  information,  to
              the  given output file. Use "-" as filename to have
              the output sent to stdout.

              This is very similar to --trace, but leaves out the
              hex part and only shows the ASCII part of the dump.
              It makes smaller output that  might  be  easier  to
              read for untrained humans.

              If  this option is used several times, the last one
              will be used. (Added in 7.9.7)

       -u/--user <user:password>
              Specify user and password  to  use  when  fetching.
              Read the MANUAL for detailed examples of how to use
              this. If no password is specified,  curl  will  ask
              for it interactively.

              You  can  also  use  the  --digest option to enable
              Digest authentication when communicating with  HTTP
              1.1 servers.

              If  this option is used several times, the last one
              will be used.

       -U/--proxy-user <user:password>
              Specify user and password to use for Proxy  authen-
              tication.  If  no  password is specified, curl will
              ask for it interactively.

              If this option is used several times, the last  one
              will be used.

       --url <URL>
              Specify a URL to fetch. This option is mostly handy
              when you want to specify URL(s) in a config file.

              This option may be used any  number  of  times.  To
              control  where  this  URL is written, use the -o or
              Makes the fetching more  verbose/talkative.  Mostly
              usable for debugging. Lines starting with '>' means
              data sent by curl, '<' means data received by  curl
              that  is  hidden in normal cases and lines starting
              with '*' means additional info provided by curl.

              Note that if you want to see HTTP  headers  in  the
              output, -i/--include might be option you're looking
              for.

              If you think this option  still  doesn't  give  you
              enough  details, consider using --trace or --trace-
              ascii instead.

              If this option is used twice, the second will again
              disable verbose.

       -V/--version
              Displays  information  about  curl  and the libcurl
              version it uses.

              The first line includes the full version  of  curl,
              libcurl  and  other 3rd party libraries linked with
              the executable.

              The second line (starts  with  "Protocols:")  shows
              all protocols that libcurl reports to support.

              The third line (starts with "Features:") shows spe-
              cific features libcurl reports to offer.


       -w/--write-out <format>
              Defines what to display after a completed and  suc-
              cessful  operation. The format is a string that may
              contain plain text mixed with any number  of  vari-
              ables.  The string can be specified as "string", to
              get read from a  particular  file  you  specify  it
              "@filename"  and  to  tell  curl to read the format
              from stdin you write "@-".

              The variables present in the output format will  be
              substituted  by  the value or text that curl thinks
              fit, as described below. All variables  are  speci-
              fied like %{variable_name} and to output a normal %
              you just write them like %%. You can output a  new-
              line  by  using \n, a carriage return with \r and a
              tab space with \t.

              NOTE: The %-letter  is  a  special  letter  in  the
              win32-environment,  where all occurrences of % must
              be doubled when using this option.

              url_effective  The URL that was fetched last.  This
                             is  mostly meaningful if you've told
                             curl to follow location: headers.

              http_code      The numerical code that was found in
                             the last retrieved HTTP(S) page.

              time_total     The total time, in seconds, that the
                             full operation lasted. The time will
                             be  displayed with millisecond reso-
                             lution.

              time_namelookup
                             The time, in seconds, it  took  from
                             the  start  until the name resolving
                             was completed.

              time_connect   The time, in seconds, it  took  from
                             the  start  until the connect to the
                             remote  host  (or  proxy)  was  com-
                             pleted.

              time_pretransfer
                             The  time,  in seconds, it took from
                             the start until the file transfer is
                             just  about  to begin. This includes
                             all pre-transfer commands and  nego-
                             tiations  that  are  specific to the
                             particular protocol(s) involved.

              time_starttransfer
                             The time, in seconds, it  took  from
                             the  start  until  the first byte is
                             just about to  be  transfered.  This
                             includes  time_pretransfer  and also
                             the time the server needs to  calcu-
                             late the result.

              size_download  The  total amount of bytes that were
                             downloaded.

              size_upload    The total amount of bytes that  were
                             uploaded.

              size_header    The  total  amount  of  bytes of the
                             downloaded headers.

              size_request   The total amount of bytes that  were
                             sent in the HTTP request.

              speed_download The average download speed that curl
                             measured for the complete upload.

              content_type   The Content-Type  of  the  requested
                             document,  if  there was any. (Added
                             in 7.9.5)

       If this option is used several times, the last one will be
       used.

       -x/--proxy <proxyhost[:port]>
              Use specified HTTP proxy. If the port number is not
              specified, it is assumed at port 1080.

              This option overrides  existing  environment  vari-
              ables  that  sets proxy to use. If there's an envi-
              ronment variable setting a proxy, you can set proxy
              to "" to override it.

              Note  that all operations that are performed over a
              HTTP proxy will transparantly be converted to HTTP.
              It  means that certain protocol specific operations
              might not be available. This is not the case if you
              can  tunnel  through  the  proxy,  as done with the
              -p/--proxytunnel option.

              If this option is used several times, the last  one
              will be used.

       -X/--request <command>
              (HTTP)  Specifies a custom request to use when com-
              municating with the  HTTP  server.   The  specified
              request  will  be used instead of the standard GET.
              Read the HTTP 1.1  specification  for  details  and
              explanations.

              (FTP) Specifies a custom FTP command to use instead
              of LIST when doing file lists with ftp.

              If this option is used several times, the last  one
              will be used.

       -y/--speed-time <time>
              If  a download is slower than speed-limit bytes per
              second during a  speed-time  period,  the  download
              gets  aborted.  If  speed-time is used, the default
              speed-limit will be 1 unless set with -y.

              This option controls transfers and  thus  will  not
              affect  slow connects etc. If this is a concern for
              you, try the --connect-timeout option.

              If this option is used several times, the last  one
              If  a  download is slower than this given speed, in
              bytes per second, for speed-time  seconds  it  gets
              aborted. speed-time is set with -Y and is 30 if not
              set.

              If this option is used several times, the last  one
              will be used.

       -z/--time-cond <date expression>
              (HTTP) Request to get a file that has been modified
              later than the given time and date, or one that has
              been modified before that time. The date expression
              can be all sorts of date strings or if  it  doesn't
              match  any  internal ones, it tries to get the time
              from a given file name instead! See the GNU date(1)
              or  curl_getdate(3)  man  pages for date expression
              details.

              Start the date expression with a dash (-)  to  make
              it  request  for  a document that is older than the
              given date/time, default  is  a  document  that  is
              newer than the specified date/time.

              If  this option is used several times, the last one
              will be used.

       -Z/--max-redirs <num>
              Set  maximum   number   of   redirection-followings
              allowed.  If -L/--location is used, this option can
              be used to prevent curl from following redirections
              "in absurdum".

              If  this option is used several times, the last one
              will be used.

       -0/--http1.0
              (HTTP) Forces curl to issue its requests using HTTP
              1.0 instead of using its internally preferred: HTTP
              1.1.

       -1/--tlsv1
              (HTTPS) Forces curl to use TSL version 1 when nego-
              tiating with a remote TLS server.

       -2/--sslv2
              (HTTPS) Forces curl to use SSL version 2 when nego-
              tiating with a remote SSL server.

       -3/--sslv3
              (HTTPS) Forces curl to use SSL version 3 when nego-
              tiating with a remote SSL server.

              If  libcurl  is  capable of resolving an address to
              multiple  IP  versions  (which  it  is  if  it   is
              ipv6-capable), this option tells libcurl to resolve
              names to IPv4 addresses only. (Added in 7.10.8)

       -6/--ipv6
              If libcurl is capable of resolving  an  address  to
              multiple   IP  versions  (which  it  is  if  it  is
              ipv6-capable), this option tells libcurl to resolve
              names to IPv6 addresses only. (Added in 7.10.8)

       -#/--progress-bar
              Make   curl   display  progress  information  as  a
              progress bar instead of the default statistics.

              If this option is used twice, the second will again
              disable the progress bar.


FILES

       ~/.curlrc
              Default config file.



ENVIRONMENT

       http_proxy [protocol://]<host>[:port]
              Sets proxy server to use for HTTP.

       HTTPS_PROXY [protocol://]<host>[:port]
              Sets proxy server to use for HTTPS.

       FTP_PROXY [protocol://]<host>[:port]
              Sets proxy server to use for FTP.

       GOPHER_PROXY [protocol://]<host>[:port]
              Sets proxy server to use for GOPHER.

       ALL_PROXY [protocol://]<host>[:port]
              Sets  proxy  server  to use if no protocol-specific
              proxy is set.

       NO_PROXY <comma-separated list of hosts>
              list of host names that shouldn't  go  through  any
              proxy. If set to a asterisk


EXIT CODES

       There  exists  a  bunch of different error codes and their
       corresponding error messages that may  appear  during  bad
       conditions.  At  the  time of this writing, the exit codes
       are:

       1      Unsupported protocol. This build  of  curl  has  no
              support for this protocol.

       3      URL malformat. The syntax was not correct.

       4      URL  user  malformatted.  The  user-part of the URL
              syntax was not correct.

       5      Couldn't resolve proxy. The given proxy host  could
              not be resolved.

       6      Couldn't  resolve  host.  The given remote host was
              not resolved.

       7      Failed to connect to host.

       8      FTP weird server reply. The server sent  data  curl
              couldn't parse.

       9      FTP access denied. The server denied login.

       10     FTP  user/password  incorrect.  Either  one or both
              were not accepted by the server.

       11     FTP weird PASS reply. Curl couldn't parse the reply
              sent to the PASS request.

       12     FTP weird USER reply. Curl couldn't parse the reply
              sent to the USER request.

       13     FTP weird PASV reply, Curl couldn't parse the reply
              sent to the PASV request.

       14     FTP  weird  227  format.  Curl  couldn't  parse the
              227-line the server sent.

       15     FTP can't get host. Couldn't resolve the host IP we
              got in the 227-line.

       16     FTP  can't  reconnect. Couldn't connect to the host
              we got in the 227-line.

       17     FTP couldn't set binary. Couldn't  change  transfer
              method to binary.

       18     Partial  file.  Only  a part of the file was trans-
              fered.

       19     FTP couldn't download/access the  given  file,  the
              RETR (or similar) command failed.

       20     FTP  write  error. The transfer was reported bad by
              the server.


       22     HTTP  page not retrieved. The requested url was not
              found or returned another error with the HTTP error
              code  being  400  or  above.  This return code only
              appears if --fail is used.

       23     Write error. Curl couldn't write data  to  a  local
              filesystem or similar.

       24     Malformed user. User name badly specified.

       25     FTP  couldn't STOR file. The server denied the STOR
              operation, used for FTP uploading.

       26     Read error. Various reading problems.

       27     Out of memory. A memory allocation request  failed.

       28     Operation  timeout.  The  specified time-out period
              was reached according to the conditions.

       29     FTP couldn't set  ASCII.  The  server  returned  an
              unknown reply.

       30     FTP  PORT  failed. The PORT command failed. Not all
              FTP servers support the PORT command, try  doing  a
              transfer using PASV instead!

       31     FTP  couldn't  use  REST.  The REST command failed.
              This command is used for resumed FTP transfers.

       32     FTP couldn't use SIZE. The SIZE command failed. The
              command  is  an  extension to the original FTP spec
              RFC 959.

       33     HTTP range error. The range "command" didn't  work.

       34     HTTP  post  error. Internal post-request generation
              error.

       35     SSL connect error. The SSL handshaking failed.

       36     FTP bad download resume. Couldn't continue an  ear-
              lier aborted download.

       37     FILE  couldn't  read file. Failed to open the file.
              Permissions?

       38     LDAP cannot bind. LDAP bind operation failed.

       39     LDAP search failed.

              not found.

       42     Aborted by callback. An application  told  curl  to
              abort the operation.

       43     Internal  error.  A  function was called with a bad
              parameter.

       44     Internal error. A function  was  called  in  a  bad
              order.

       45     Interface  error.  A  specified  outgoing interface
              could not be used.

       46     Bad password entered. An error  was  signaled  when
              the password was entered.

       47     Too  many redirects. When following redirects, curl
              hit the maximum amount.

       48     Unknown TELNET option specified.

       49     Malformed telnet option.

       51     The remote peer's SSL certificate wasn't ok

       52     The server didn't reply  anything,  which  here  is
              considered an error.

       53     SSL crypto engine not found

       54     Cannot set SSL crypto engine as default

       55     Failed sending network data

       56     Failure in receiving network data

       57     Share is in use (internal error)

       58     Problem with the local certificate

       59     Couldn't use specified SSL cipher

       60     Problem with the CA cert (path? permission?)

       61     Unrecognized transfer encoding

       62     Invalid LDAP URL

       63     Maximum file size exceeded

       XX     There  will  appear more error codes here in future


AUTHORS / CONTRIBUTORS

       Daniel  Stenberg is the main author, but the whole list of
       contributors is found in the separate THANKS file.


WWW

       http://curl.haxx.se


FTP

       ftp://ftp.sunet.se/pub/www/utilities/curl/


SEE ALSO

       ftp(1), wget(1), snarf(1)








































Man(1) output converted with man2html
twittering-mode-3.1.0/win-curl/docs/CHANGES0000664000175000017500000015430612772521564020162 0ustar tadashitadashi _ _ ____ _ ___| | | | _ \| | / __| | | | |_) | | | (__| |_| | _ <| |___ \___|\___/|_| \_\_____| Changelog Version 7.10.8 (1 November 2003) Daniel (31 October) - Assume that MDTM on an FTP server returns the timestamp using the UTC time zone. This changes the time CURLINFO_FILETIME returns for a given file over FTP, and will change existing uses of CURLOPT_TIMECONDITION. It will make the functionality more similar to how the HTTP one is already working. - Command line options that take numerical parameters (such as -y, -Y, -C etc) now report error and exit if the parameter isn't truly a number greater than or equal to zero. This helps users to notice bad usage earlier. Before, when a user forgot or missed to add a numerical parameter to an option, the command line parser would simply "eat" the following option and it would cause great confusion. Daniel (30 October) - David Hull made libcurl deal with NOBODY and HEADER for file:// the same way it already does for FTP: it provides HTTP-looking headers that provide info only about the file, without doing the actual transfer. The curl tool then lets --head do this. Daniel (29 October) - runtests.pl now checks for and use valgrind if present. It will redirect the valgrind results in log/valgrind[num] but it currently doesn't scan that file for any errors or anything, that is still only made manually. - David Hull made the file: URL parser also accept the somewhat sloppy file syntax: file:/path. I added test case 203 to verify this. Daniel (28 October) - Dan C tracked down yet another weird behavior in the glibc gethostbyname_r() function for some specific versions (reported on 2.2.5 and 2.1.1), and provided a fix. On Linux machines with these glibc versioins, non-ipv6 builds of libcurl would often fail to resolve perfectly resolvable host names. Daniel (26 October) - James Bursa found out that curl_msnprintf() could write the trailing zero-byte outside its given buffer size. This could happen if you generated a very long error message as then libcurl would overwrite the ERRORBUFFER with one byte. Using a non-existing very long local file:// name is one case that could make this occur. Daniel (24 October) - David Hull filed bug report #829827. It identified a problem with -C - if the full file already was downloaded and thus the server responded with a 416. libcurl would then wrongly use the Content-Length: header and expect that size to get transfer, causing a "hang" until the server closed the connection and then an error 18 ("still N bytes data left of the transfer"). Now we don't return any error at all, but I think libcurl should perhaps return some kind of info since the requested range was out of the size of the document. - Based on David Hull's fix in bug report #804599, we now check for solaris and gcc in configure and set the -mimpure-text link flag for linking the lib better. - I've introduced a -t option to the runtests.pl script. With that option set, the script runs special "memory torture" tests. For each test command line in that section, the script first runs the command line and counts the total amount of allocations made. It then runs the exact same command line again, forcing allocation number N to fail. It will try every N from 1 to the total number of amounts made. For every invoke, it checks that no memory was leaked as that would indicate a bad cleanup somewhere in the code. This is just beginning to work, and I've already made some corrections in libcurl code. When this code works somewhat fine, I'll make sure 'make test' in the root dir will run these tests as well. Daniel (23 October) - Georg Horn fixed how the CA verification is made. Verifications can now be made while at the same time the result of it can be ignored. This also affects the curl tool as -k can now be used together with --cacert or --capath. Daniel (22 October) - Gisle Vanem found out --disable-eprt didn't work and patched it. - Test case 91 was modified and could now repeat the problem Kevin Roth has reported, and the bug was fixed. - Dylan Ellicott added vc-libcurl-ssl-dll as a target to the root makefile to build a static libcurl that links with a shared OpenSSL using MSVC. Daniel (21 October) - Andrés García updated the mingw32 makefiles. Version 7.10.8-pre5 (21 October 2003) Daniel (19 October) - Georg Horn made libcurl output more info on SSL failures when receiving data. Version 7.10.8-pre4 (18 October 2003) Daniel (17 October) - Dominick Meglio implemented CURLOPT_MAXFILESIZE and --max-filesize. - Made libcurl show verbose info about what auth type and user name that is being sent in its HTTP request-headers. Daniel (16 October) - Removed support for CURLOPT_PASSWDFUNCTION and CURLOPT_PASSWDDATA. libcurl no longer prompt for passwords under any circumstances. Password prompting was instead moved to curl, which now prompts for password if -u or -U lack it. This solves the problem Kevin Roth reported when curl prompted for password twice when doing NTLM authentication. - I rewrote the SSL subjectAltName check to avoid having to rely on OpenLDAP- licensed derivate code. Daniel (15 October) - Avoid doing getsockopt() on Windows to verify connects. It seems that this hogs Windows machines when libcurl is being used multi-threaded (with > ~50 threads). Andrew Fuller helped us verify and test this. Daniel (14 October) - Kimmo Kinnunen fixed a crash with duphandle() when CURLDEBUG is set. - Gisle Vanem made libcurl build and work with IPv6 on Windows. Daniel (13 October) - Giuseppe Attardi reported yet another segfault with ares and the multi interface. Me fixed. - Domenico Andreoli removed the extra LDFLAGS assignment in lib/Makefile.am that was reported about in the debian bug report #212086. Domenico also fixed two makefiles where we used 'gnroff' instead of the more portable $(NROFF). Daniel (12 October) - Dirk Manske made the share locking around DNS lookups slightly different to allow the share system's DNS lookups to run somewhat more independent/faster. Daniel (9 October) - Lachlan O'Dea fixed a resume problem: "If I set CURLOPT_RESUME_FROM, perform an HTTP download, then reset CURLOPT_RESUME_FROM to 0, the next download still has a Range header with a garbage value." bug report #820502 - Dominick Meglio made the inet_pton.c file build fine using MSVC. - The 'sws' test suite web server now #include setup.h from the lib directory. This makes it more portable easier. Version 7.10.8-pre3 (8 October 2003) Daniel (8 October) - Frank Ticheler provided a patch that fixes how libcurl connects to multiple addresses, if one of them fails (ipv4-code). Daniel (7 October) - Neil Dunbar provided a patch that now makes libcurl check SSL subjectAltNames when matching certs. This is apparently detailed in RFC2818 as the right thing to do. I had to add configure checks for inet_pton() and our own (strictly speaking, code from BIND written by Paul Vixie) provided code for the function for platforms that miss it. - HTTP POST using the read callback didn't work, as Florian Schoppmann reported. Daniel (5 October) - Shared provided a few fixes to make libcurl build on BeOS out-of-the-box. New code for BeOS-style non-blocking sockets, provided by Shard and Jeremy Friesner. Modified the autoconf check for non-blocking sockets to check for this kind too. Daniel (4 October) - Vincent Bronner pointed out that if you set CURLOPT_COOKIE for a transfer and then set it to NULL in a subsequent one, the previous cookie was still sent off! - Jon Turner fixed a problem libcurl had when it failed on an FTP transfer due to a bad path, it would cause the next transfer to use a bad path as well. - Siddhartha Prakash Jain provided a patch with a fix for libcurl with ares, when working on IP-only names as we then could return "wait" status when the name in fact already was resolved. I edited the patch slightly to not expose async details to non-ares aware source code. Daniel (3 October) - Neil Spring posted the debian bug report #213180, and pointed out that using the name 'access' in a function prototype is not very wise as some compilers complain. - Peter Sylvester provided his and Jean-Paul Merlin's curlx.c example source code that shows how they use ssl and callbacks. Daniel (2 October) - James MacMillan's patch makes curl build on QNX 6.2.x. Daniel (26 September) - My daughter was born! Daniel (23 September) - Added support for -4/--ipv4 and -6/--ipv6 to force names to resolve to that particular IP version. They only work for IPv6-enabled libcurls. - curl -V now outputs 'SPNEGO' as a feature in case libcurl was built to support that. Version 7.10.8-pre2 (22 September 2003) Daniel (22 September) - Giuseppe Attardi found a segfault in libcurl when using the multi interface with ares and doing repeated operations against a non-resolving host name. Daniel (19 September) - Added the CURLOPT_IPRESOLVE option, that allows an application to select what kind of IP addresses he wants to use when resolving host names. This is only interesting when using host names that resolve addresses using more than one version of IP. - Applied Markus Moeller's patch that introduces SPNEGO support if libcurl is built with the FBopenssl libraries. curl_version_info() now returns info on SPNEGO availability. The patch also made the GSSAPI stuff work fine with the MIT GSS-library (the Heimdal one still works too). Daniel (16 September) - Doing PUT with --digest failed, as reported in bug report #805853. - Using --anyauth that picked NTLM, and then a redirect closed the connection and took curl to a second NTLM page made curl fail. Bug report #806328 identified the problem, test case 90 was added to verify the fix. Daniel (14 September) - codemastr brought a patch for ares to make the Windows portions of it work properly on NT4. I uploaded a new diff and updated the docs on where to get it etc. - Jeff Pohlmeyer tracked down a very hard-to-find bug where we removed a cached DNS entry even though it may be in use, which caused "random" memory to get overwritten and thus "random" crashes. Daniel (12 September) - Based on a bug report by David Kimdon, I made the runtests.pl script clear all possible proxy environment variables before the tests are run. - By default, easy handles within a multi handle now share DNS cache. - Tim Bartley brought a patch that makes the GSSNEGOTIATE option work for Microsoft's "Negotiate" authentication as well. Daniel (11 September) - A zero-length proxy string confused FTP transfers. - Bjorn Reese found a case with an uninitialized pointer, only present when built for ares. Version 7.10.8-pre1 (8 September 2003) Daniel (7 September) - Jurij Smakov found out that the non-OpenSSL MD5 code was not working on Alpha (or ia64). Only the OpenSSL-version did. I made a fix I think corrects the problem. Daniel (5 September) - Kevin Fisk reported that configure --enable-thread didn't work. I fixed. - De-macrofied the lib/hash.c source code somewhat. Daniel (4 September) - CURLINFO_HTTPAUTH_AVAIL and CURLINFO_PROXYAUTH_AVAIL added, Based on Joerg Mueller-Tolk's patch, Early (4 September) - Added CURLOPT_FTP_RESPONSE_TIMEOUT - allows user to set strict timeout requirements on the FTP server's ability to respond to individual commands without placing global requirements on transfer or connect time. Files affected: - include/curl/curl.h Added option CURLOPT_FTP_RESPONSE_TIMEOUT - lib/ftp.c Added branch inside Curl_GetFTPResponse to check for data->set.ftp_response_timeout - lib/url.c Modified Curl_setopt to recognize CURLOPT_FTP_RESPONSE_TIMEOUT - lib/urldata.h Added ftp_response_timeout to struct UserDefined Daniel (3 September) - Peter Pentchev found and fixed two problems in the test suite's web server code, that made it segfault at times. - Jörg Mueller-Tolk improved the proxy user+password handling, especially when providing a blank password. Daniel (2 September) - Fix for making CONNECT to proxies do the correct magic to allow NTLM, Digest and similar to work. Daniel (1 September) - Henrik Storner made libcurl work fine with OpenLDAP 2.1.22 (current). - Jeff Pohlmeyer added a proper error message for non-resolving hosts when using ares for lookups. Daniel (25 August) - John McGowan reported that curl -k still failed if the HTTPS server's CN field wasn't obtainable. This was due to the CURLOPT_SSL_VERIFYHOST being set to 1, and libcurl failed if the CN was missing. Starting now, having it set to 1 will simply output a warning if no CN could be obtained (as having a mismatch is OK). Daniel (21 August) - Vincent Sanders provided a fix for name resolving when linked with uClibc. Daniel (20 August) - Gerd v. Egidy provided a patch that makes libcurl store the FTP response code from ftp servers. Using curl_easy_getinfo() with CURLINFO_HTTP_CODE returns that data. The option is therefore now also known as CURLINFO_RESPONSE_CODE. - Antoine Calando found a segfault when doing multi-part/formpost using the multi interface. - Antoine Calando pointed out that curl_multi_info_read() didn't set the msgs_in_queue to 0 properly when returning NULL. Daniel (19 August) - I made curl support multiple -T options, as well as -T "{file1,file2}" style globbing. One -T for each URL is supported. - Jeff Pohlmeyer found a segfault when using ares-enabled libcurl and the multi interface when trying a non-existing host name. - Made the libcurl printf code support long longs if available. - Loren Kirkby pointed out that we did not clean up all SSL-allocated memory in curl_global_cleanup(). Daniel (17 August) - Setting CURLOPT_WRITEFUNCTION or CURLOPT_READFUNCTION to NULL will now make them get the internal defaults restored. Previously this could cause a segfault. We should aim at having all pointer-related options get restored to default/safe values when set to NULL. Version 7.10.7 (15 August 2003) Daniel (14 August) - I modified the memdebug system to return failure on memory allocation functions after a set amount of successful ones. This enables us to test out-of-memory situations in a controlled manner and we can make sure that curl/libcurl behaves good in those. This made me find and fix several spots where we did not cleanup properly when bailing out due to errors (low memory). - Corrected test case 74. Made using -o with bad #[num] codes complain and bail out. Made #[num] support numbers larger than 9 as well. Added test case 86 for a proper range globbing test as well. Version 7.10.7-pre4 (12 August 2003) Daniel (12 August) - curl_version_info() now returns a flag if libcurl was built with asynch DNS support, and this is now also displayed with 'curl -V'. - Added a few new man pages to the docs/libcurl dir: curl_share_init, curl_share_setopt, curl_share_cleanup, libcurl-easy and libcurl-share. Daniel (11 August) - Mike Cherepov made the local binding code work for Windows, which makes the option CURLOPT_INTERFACE work on Windows as well. - Vincent Sanders updated the fopen.c example code a lot. - --proxy-ntlm is now supported by the curl tool. It forces the proxy authentication to be made using NTLM. It does not yet work for HTTPS over proxies (or other proxy-tunneling options). Test case 81 and 82 do some simple initial ntlm testing. - Found and fixed a minor memory leak on re-used connections with proxy-authentication. - I removed -@ and -Z as valid short options. They were very rarely used (@ wasn't even documented). - Serge Semashko introduced CURLOPT_PROXYAUTH, and make it work when set to CURLAUTH_NTLM and/or CURLAUTH_BASIC. The PROXAUTH is similar to HTTPAUTH, but is for the proxy connection only, and HTTPAUTH is for the remote host. - Fixed loading of cookies with blank contents from a cookie jar. Also made the cookie functions inform on added and skipped cookies (for cookie debugging). Version 7.10.7-pre3 (8 August 2003) Daniel (8 August) - Applied David Byron's fix for file:// URLs with drive letters included. - I added the --ftp-create-dirs to the client code, which activates Early's CURLOPT_FTP_CREATE_MISSING_DIRS option, and wrote test case 147 to verify it. Added the option to the curl.1 man page too. Added the option to the curl_easy_setopt.3 man page too. Daniel (7 August) - Test case 60 failed on ia64 and AMD Opteron. Fixed now. - Fixed a printf problem that resulted in urlglobbing bugs (bug #203827 in the debian bug tracker). Added test case 74 to verify the fix and to discover if this breaks in the future. - "make distcheck" works again. Version 7.10.7-pre2 (6 August 2003) Daniel (5 August) - Duncan Wilcox helped me verify that the latest incarnation of my ares patch builds fine on Mac OS X (see the new lib/README.ares) file for all details. - Salvatore Sorrentino filed bug report #783116 and Early Ehlinger posted a bug report to the libcurl list, both identifying a problem with FTP persitent connections and how the dir hiearchy was not properly reset between files. - David Byron's thoughts on a fixed Makefile in tests/ were applied. - Jan Sundin reported a case where curl ignored a cookie that browsers don't, which turned up to be due to the number of dots in the 'domain'. I've now made curl follow the the original netscape cookie spec less strict on that part. Daniel (4 August) - Dirk Manske added cookie support for the experimental, hidden and still undocumented share feature! - Mark Fletcher provided an excellent bug report that identified a problem with FOLLOWLOCATION and chunked transfer-encoding, as libcurl would not properly ignore the body contents of 3XX response that included the Location: header. Early (6 August) - Added option CURLOPT_FTP_CREATE_MISSING_DIRS This option will force the target file's path to be created if it does not already exist on the remote system. Files affected: - include/curl/curl.h Added option CURLOPT_FTP_CREATE_MISSING_DIRS - lib/ftp.c Added function ftp_mkd, which issues a MKD command Added function ftp_force_cwd, which attempts a CWD, and does a MKD and retries the CWD if the original CWD fails Modified ftp_perform() to call its change directory function through a pointer. The pointer points to ftp_cwd by default, and is modified to point to ftp_force_cwd IFF data->set.ftp_create_missing_dirs is not 0. - lib/url.c Modified Curl_setopt to recognize CURLOPT_FTP_CREATE_MISSING_DIRS - lib/urldata.h Added ftp_create_missing_dirs to struct UserDefined - Minor Bugfix for CURLOPT_TIMECONDITION with FTP - if the file was not present to do the time comparison, it would fail. Files affected: - lib/ftp.c In ftp_perform(), the call to ftp_getfiletime() used to be followed by if (result) return result; And then by the code that actually did the time comparison. The code that did the comparison handled the case where the filetime was not available (as indicated by info.filetime < 0 or set.timevalue < 0), so I replaced the if (result) return result with a switch(result) that allows CURLE_FTP_COULDNT_RETR_FILE to fall through to the normal time comparison. Daniel (3 August) - When proxy authentication is used in a CONNECT request (as used for all SSL connects and otherwise enforced tunnel-thru-proxy requests), the same authentication header is also wrongly sent to the remote host. This is a rather significant info leak. I've fixed it now and mailed a patch and warning to the mailing lists. Daniel (1 August) - David Byron provided a patch to make 7.10.6 build correctly with the compressed hugehelp.c source file. Version 7.10.7-pre1 (31 July 2003) Daniel (30 July) - Jörg Müller-Tolk updated the VC makefile. - Daniel Noguerol made the ftp code output "Accept-Ranges: bytes" in similar style like other faked HTTP headers when NOBODY and HEADER are used. I updated two corresponding test cases too. - Marty Kuhrt pointed out a compilation problem on VMS due to my having changed a type from long to time_t, and I'm now changing it back to work more portably... He also indicated that distributing the src/hugehelp.c in a compressed state like I acccidentally did may not be the smartest move... I've now fixed the distribute procudere to automaticly generate an uncompressed version when I make release archives. Daniel (29 July) - Gisle Vanem brought changes to the mkhelp script for the generation of the compressed help text on some platforms. Version 7.10.6 (28 July 2003) Daniel (28 July) - François Pons brought a patch that once again made curl deal with ftp and "double slash" as indicating the root directory. In the RFC1738-fix of April 30, that ability was removed (since it is not the "right" way). So, starting now we can list the root dir of an ftp server both these ways: curl ftp://server.com/%2f as well as curl ftp://server.com// Daniel (24 July) - Henry Bland pointed out that we included sys/resource.h without good reason in several source files. Without it included, QNX builds better... - Andrés García updated the mingw makefiles. Daniel (23 July) - Tracy Boehrer experienced DNS cache problems and did some nice debugging and tracking which made it easy for me to correct the problem and Tracy could verify that it did cure the problem! When re-using a connection we now make sure we don't re-use the 'connect_addr' struct. - Daniel Kouril corrected the GSS-Negotiate code. - Juan F. Codagnone provided fixes to allow curl to build fine on Windows again. Daniel (22 July) - Edited the curl/curl.h include file to build on Windows properly. Daniel (21 July) - Moved the proxy credentials from the SessionHandle struct to the connectdata struct, to make multiple proxy connections with differerent user names work. - Adjusted the NTLM code to support proxy functionality. - Made the krb4 stuff compile with the user+password fields moved. Version 7.10.6-pre4 (21 July 2003) Daniel (20 July) - David Gardner pointed out in bug report 770755 that using the FTP command CWD with a blank argument is a bad idea and I made libcurl skip empty path segments starting now. Daniel (18 July) - Cris pointed out that my fix on July 16th didn't work fully. His pointing out this (and his patch) also made me realize that we have a very similar bug in the FTP connection re-use code. We must store a separate user and password field for each connection we keep (at least for FTP and HTTP+NTLM connections, so I made us do this unconditionally). - Since NTLM authenticates connections instead of single requests, I had to re-arrange how we store the NTLM data and I had to improve the test suite to finally work properly with persistancy to make the NTLM tests run fine again. This also forced me to have to update lots of HTTP test cases. Daniel (16 July) - Cris Bailiff's bug report 768275 pointed out that using Basic auth with wrong user+password caused an endless loop. Fixed now. He also found out that we didn't properly authenticate connections with NTLM. Fixed too. - Dan Winship provided fixes for the NTLM code. Daniel (5 July) - Doug Kaufman provided additional fixes for the DOS port. Daniel (4 July) - Rick Richardson pointed out that using setvbuf() to achive non-buffering on output is no-good for SCO Xenix and other unixes. We switched over to using plain fflush() instead. - Dan Grayson pointed out that we set the CURL_CA_BUNDLE variable wrongly in the configure script, and I had to change some build stuff to make the new way work. - Peter Sylvester's patch was applied that introduces the following: CURLOPT_SSL_CTX_FUNCTION to set a callback that gets called with the OpenSSL's ssl_ctx pointer passed in and allow a callback to act on it. If anything but CURLE_OK is returned, that will also be returned by libcurl all the way back. If this function changes the CURLOPT_URL, libcurl will detect this and instead go use the new URL. CURLOPT_SSL_CTX_DATA is a pointer you set to get passed to the callback set with CURLOPT_SSL_CTX_FUNCTION. Daniel (1 July) - David Byron provided a patch that allows a client to quit the test suite's HTTP server. - Gisle Vanem found and patched a lib handle leak in the ldap code. Daniel (25 June) - More NTLM-improvements. Less code. Smaller packets back and forth. Daniel (23 June) - Eric Glass provided us with a better doc on NTLM details, and I added more comments and clarified the current code more. Using the new knowledge, we should be able to make the NTLM stuff work even better. Eric's original URL: http://davenport.sourceforge.net/ntlm.html Version stored and provided at curl site: http://curl.haxx.se/rfc/ntlm.html - Fixed the minor compile problems pre3 had if built without GSSAPI and/or SSL. Version 7.10.6-pre3 (19 June 2003) Daniel (19 June) - Made curl use curl_free() on memory returned by curl_getenv(), as this should theoreticly make it possibly to build and run curl and libcurl with different memory allocation schemes with no problems. Daniel (18 June) - Improved the mkhelp.pl a bit further to make a nicer hugehelp text and to include a better comment in the top for the gzip compressed version. Daniel (17 June) - CURLOPT_HTTPAUTH is now a bitmask, in which you set which authentication type(s) you want to use. If more than one is set, libcurl will use one of the selected one and the one it considers is more secure. Test case 67 and 68 (for NTLM) were fixed and we've reduced a round-trip for specific --ntlm featches, and test case 69 and 70 were added for testing authentication "picking". --anyauth is the new command line tool option, and I also added --basic for completeness (that's the default type). - Fixed the runtests.pl script to use the info provided by the new curl -V output. - --enable-debug now sets the CURLDEBUG define instead of MALLOCDEBUG, as it is meant to be a generic debug conditional. - curl_version_info() can now return CURL_VERSION_DEBUG as a feature bit, to indicate that the library was built with CURLDEBUG set. - Ralph Mitchell found out that some web applications very badly uses white spaces in Location: redirects, and apparently IE is a browser (the only one?) that supports this abomination. Based on Ralph's patch, I added code that now attempts to replace white spaces with the proper "%20" or "+". Test case 40 and 42 were added to verify my changes. - curl -V now also outputs a list of features the available library offers (if any). - The curl_version() string now includes "GSS" if libcurl is built with GSSAPI support. - David Orrell reported that libcurl still crashed when sending HUGE requests over HTTPS... I fixed. Version 7.10.6-pre2 (16 June 2003) Daniel (16 June) - curl_version_info() now returns bitmasked information weather NTLM and GSSNEGOTIATE are supported, since it is doomed to vary on different installatiions. - I remade the HTTP Digest code to use the MD5-code provided by OpenSSL if that is present, and only use our own MD5-code if it isn't. Daniel (13 June) - More NTLM help, fixes and patches from Cris Bailiff. - Marty Kuhrt brought include fixes for making VMS builds warning-free. Daniel (12 June) - NTLM authentication works somewhat against the test servers provided by Mathias Axelsson and Cris Bailiff. Use by setting CURLOPT_HTTPAUTH to CURLAUTH_NTLM to libcurl, or --ntlm for the curl tool. Test case 67 and 68 were added for this. NTLM-support requires OpenSSL. - Dan Fandrich provided a patch, that granted that gzip and libz are available at build-time, compresses the hugehelp text in the curl command line and uncompresses it at request. Saves some ~60K in the final output executable. Daniel (11 June) - Long day of fighting the NTLM demons. Daniel (10 June) - Modified how to set auth type to libcurl. Now use CURLOPT_HTTPAUTH instead, and pick method. Supported ones currently are: CURLAUTH_BASIC - default selection CURLAUTH_DIGEST - formerly CURLOPT_HTTPDIGEST CURLAUTH_GSSNEGOTIATE - Daniel Kouril added HTTP GSS-Negotiate authentication support, as defined in the IETF draft draft-brezak-spnego-http-04.txt. In use already by various Microsoft web applications. --negotiate is the new family member. To take advantage of this, you need one of these packages: o Heimdal Kerberos5 http://www.pdc.kth.se/heimdal/heimdal.html o GSSAPI from Globus http://www.globus.org/ o GSSAPI libraries from MIT Kerberos5 http://web.mit.edu/kerberos/www/ - A missing ending bracket (']') while doing URL globbing could lead to a segfault. While fixing this, I also introduced better error reporting in the globbing code. (All this is application code outside libcurl.) Daniel (6 June) - David Orrell found out that sending a huge GET request over HTTPS could make libcurl fail and return an error code. Daniel (2 June) - Richard Bramante found out that "Content-Length: 0" was not properly used by libcurl if the response-headers indicated that the connection would be closed. - David Byron's patch was applied, that makes the --progress-bar take the local size into account when doing resumed downloads. - Feedback from Serge Semashko made me change the error message returned when CURLE_HTTP_RETURNED_ERROR is returned. - Anonymous in bug report #745122 pointed out that we should really be using SSL_CTX_set_options(... SSL_OP_ALL) to work around flaws in existing SSL implementations. Daniel (27 May) - Andreas Ley and Rich Gray helped me point out that no version of HP-UX has the sys/select.h header file so including it unconditionally in curl/multi.h is not a good thing. Now we check for HPUX and avoid using that header on such systems. - Rudy Koento experienced problems with curl's recent habit of POSTing data in two separate send() calls, first the headers and then the data. I've now made a fix that for static and known content that is less than 100K in size, everything is now sent in one single system call again. This is also better for network performance reasons. - I modified the main makefile to not build the test suite and a few other unnecessary things by default. Now, the test suite is built when 'make test' is run. This reduces build time for those who don't care for the test suite, and it also reduces confusion for people using platforms where the test suite build fails! Daniel (26 May) - Chris Lewis pointed out a flaw in the #ifdefs in curl/multi.h for Windows, which is now corrected. - Jis Joy found another flaw in the SOCK5 code, as libcurl treated the socks5 proxy a little too much like as if it was a http proxy. Daniel (23 May) - Ricardo Cadime found a socket leak when listing directories without contents. Test cases 144 and 145 were added to verify the fix. - Rudy Koento found yet another problem when a HTTP server returns only a single-line of contents without any headers at all. libcurl then failed to count the data, thus returning error 52 "no contents". Test case 66 was added to verify that we now do right. Version 7.10.6-pre1 (23 May 2003) Daniel (23 May) - Jis in bug report #741841, fixed a bug in the SOCKS5 proxy-using code. Daniel (22 May) - David Remahl set up a test-server for me providing Digest authentication, and I wrote the first working code that support it. The test suite was modified slightly as well to work better for it and --digest was added to the command line options (and CURLOPT_HTTPDIGEST to the library)... RFC2617 has all the gory details. Daniel (21 May) - David Balazic pointed out that curl_unescape() didn't check that %-codes were correctly followed by two hexadecimal digits when it unescape strings. Now, we do the check and only %XX codes are unescaped if the X letters are hexadecimals. - Gisle Vanem made curl build with djgpp on DOS. - Gisle Vanem improved the mkhelp.pl script to make a nicer manual that is shown with curl -M. Daniel (20 May) - Gisle Vanem provided a fix that makes libcurl more conservative, not expecting h_aliases of the hostent struct to always be non-NULL. Daniel (19 May) - As requested by Martin Michlmayr in Debian bug report #193630, libcurl now supports user name and password in the proxy environment variables. Added test case 63 to verify this. Version 7.10.5 (19 May 2003) Daniel (15 May) - Changed the order for the in_addr_t testing, as 'unsigned long' seems to be a very common type inet_addr() returns. Daniel (14 May) - George Comninos provided a fix that calls the progress meter when waiting for FTP command responses take >1 second. It'll make applications more "responsive" even when dealing with very slow ftp servers. Daniel (12 May) - George Comninos pointed out that libcurl uploads had two quirks: o when using FTP PORT command, it used blocking sockets! o it could loop a long time without doing progress meter updates Both items are fixed now. Daniel (9 May) - Dan Fandrich changed CURLOPT_ENCODING to select all supported encodings if set to "". This frees the application from having to know which encodings the library supports. - Dan Fandrich pointed out we had three unnecessary files in CVS that is generated with libtoolize, so they're now removed and libtoolize is invoked accordingly in the buildconf script. - Avery Fay found out that the CURLOPT_INTERFACE way of first checking if the given name is a network interface gave a real performance penalty on Linux, so now we more appropriately first check if it is an IP number and if so we don't check for a network interface with that name. - CURLOPT_FTP_USE_EPRT added. Set this to FALSE to disable libcurl's attempts to use EPRT and LPRT before the traditional PORT command. The command line tool sets this option with '--disable-eprt'. Version 7.10.5-pre2 (6 May 2003) Daniel (6 May) - Kevin Delafield reported another case where we didn't correctly check for EAGAIN but only EWOULDBLOCK, which caused badness on HPUX. Daniel (4 May) - Ben Greear noticed that the check for 'writable argv' exited the configure script when run for cross-compiling, which wasn't nice. Now it'll default to no and output a warning about the fact that it was not checked for. Daniel (2 May) - Added test case 62 and fixed some more on the cookie sending with a custom Host: header set. Daniel (1 May) - Andy Cedilnik fixed a few compiler warnings. - Made the "SSL read error: 5" error message more verbose, by adding code that queries the OpenSSL library to fill in the error buffer. Daniel (30 Apr) - Added sys/select.h include in the curl/multi.h file, after having been reminded about this by Rich Gray. - I made each test set its own server requirements, thus abandoning the previous system where the test number implied what server(s) to use for a specific test. - David Balazic made curl more RFC1738-compliant for FTP URLs, by fixing so that libcurl now uses one CWD command for each path part. A bunch of test cases were fixed to work accordingly. - Cookie fixes: A. Save domains in jars like Mozilla does. It means all domains set in Set-Cookie: headers are dot-prefixed. B. Save and use the 'tailmatch' field in the Mozilla/Netscape cookie jars (the second column). C. Reject cookies using illegal domains in the Set-Cookie: line. Concerns both domains with too few dots or domains that are outside the currently operating server host's domain. D. Set the path part by default to the one used in the request, if none was set in the Set-Cookie line. To make item C really good, I also made libcurl notice custom Host: headers and extract the host name set in there and use that as the host name for the site we're getting the cookies from. This allows user to specify a site's IP-address, but still be able to receive and send its cookies properly if you provide a valid Host: name for the site. Daniel (29 Apr) - Peter Kovacs provided a patch that makes the CURLINFO_CONNECT_TIME work fine when using the multi interface (too). Version 7.10.5-pre1 (23 Apr 2003) Daniel (23 Apr) - Upgraded to libtool 1.5. Daniel (22 Apr) - Peter Sylvester pointed out that curl_easy_setopt() will always (wrongly) return CURLE_OK no matter what happens. - Dan Fandrich fixed some gzip decompression bugs and flaws. Daniel (16 Apr) - Fixed minor typo in man page, reported in the Debian bug tracker. Daniel (15 Apr) - Fixed some FTP tests in the test suite that failed on my Solaris host, due to the config.h not being included before the system headers. When done that way, it did get a mixed sense of if big files are supported or not and then stat() and fstat() (as used in test case 505) got confused and failed to return a proper file size. - Formposting a file using a .html suffix is now properly set to Content-Type: text/html. Daniel (14 Apr) - Fixed the SSL error handling to return proper SSL error messages again, they broke in 7.10.4. I also attempt to track down CA cert problems and then return the CURLE_SSL_CACERT error code. - The curl tool now intercepts the CURLE_SSL_CACERT error code and displays a fairly big and explanatory error message. Kevin Roth helped me out with the wording. Daniel (11 Apr) - Nic Hines provided a second patch for gzip decompression, and fixed a bug when deflate or gzip contents were downloaded using chunked encoding. - Dan Fandrich made libcurl support automatic decompression of gzip contents (as an addition to the previous deflate support). - I made the CWD command during FTP session consider all 2xy codes to be OK responses. Daniel (10 Apr) - Vlad Krupin fixed a URL parsing issue. URLs that were not using a slash after the host name, but still had "?" and parameters appended, as in "http://hostname.com?foobar=moo", were not properly parsed by libcurl. Daniel (9 Apr) - Made CURLOPT_TIMECONDITION work for FTP transfers, using the same syntax as for HTTP. This then made -z work for ftp transfers too. Added test case 139 and 140 for verifying this. - Getting the file date of an ftp file used the wrong time zone when displayed. It is supposedly always GMT. Added test case 141 for this. - Made the test suite's FTP server support MDTM. - The default DEBUGFUNCTION, as enabled with CURLOPT_VERBOSE now outputs CURLINFO_HEADER_IN data as well. The most notable effect from this is that using curl -v, you get to see the incoming "headers" as well. This is perhaps most useful when doing ftp. Daniel (8 Apr) - James Bursa fixed a flaw in the Content-Type extraction code, which missed the first letter if no space followed the colon. - Magnus Nilsson pointed out that share.c was missing in the MSVC project file. Daniel (6 Apr) - Ryan Weaver provided a patch that makes the CA cert bundle not get installed anymore when 'configure --without-ssl' has been used. Daniel (4 Apr) - Martijn Broenland found another cases where a server application didn't like the boundary string used by curl when foing a multi-part/formpost. We modified the boundary string to look like the one IE uses, as this is probably gonna make curl work with more applications. Daniel (3 Apr) - Kevin Roth reported that a bunch of tests fails on cygwin. One set fails when using perl 5.8 (and they run fine with perl 5.6), and another set failed because of an artifact in the test suite's FTP server that I corrected. It turned out the FTP server code was still having a file opened while the main test script removed it and invoked the HTTP server that attempted to create the same file name of the file the FTP server kept open. This operation works fine on unix, but not on cygwin. Version 7.10.4 (2 Apr 2003) Daniel (1 Apr) - Added test case 505 to exercise FTP upload with rename done with libcurl, and for that I had to extend the test suite's FTP server to deal with the RNFR and RNTO commands. Daniel (31 Mar) - Even more SSL config check modifications after Richard's testing. Version 7.10.4-pre6 (31 Mar 2003) Daniel (31 Mar) - More fixes for the SSL session ID cache checks when SSL configs are changed between connections. Based on tests and talks with Richard Bramante. - Guillaume Cottenceau provided a patch that added CURLOPT_UNRESTRICTED_AUTH. When enabled, it will prevent libcurl from limiting to which host it sends user+password to when following locations. By default, libcurl only sends name and password to the original host used in the first URL, but with this option set it will send the auth info to all hosts it follows location headers to. The new tool command line option for this is named "--location-trusted". - Frankie Fong reported a problem with libcurl if you re-used an easy handle with a proxy, and you first made a https:// connction to a host and then switched to a http:// one to the same host. libcurl would then wrongly re-use the same connection for it and fail to get the second URL properly Daniel (29 Mar) - Dan Shearer's fix that makes curl complain if invoked with nothing but "curl -O" was applied. Daniel (26 Mar) - Bryan Kemp was friendly enough to lend me an account on his Redhat 9 box and I could fix the configure problems on redhat 8.1 and 9 in no time thanks to this. Thanks a bunch Bryan! Daniel (25 Mar) - Renamed configure.in to configure.ac Version 7.10.4-pre5 (25 Mar 2003) Daniel (25 Mar) - Richard Bramante provided a fix for a handle re-use problem seen when you change options on an SSL-enabled connection between requests. Previously, changing peer verification or host verification and similar things was not taken into account when a connection were checked for re-use and thus enabling stricter check between requests on a re-used connection made no difference and the connection would thus be used erroneously. Daniel (24 Mar) - Götz Babin-Ebell pointed out that the ca-bundle.crt file contained a certificate from Trustcenter that was a demo certificate only that was never indended to be part of a CA bundle. Daniel (21 Mar) - Life is a mystery. Within a time period of 17 hours, Tim Pope and Michael Churchill filed one bug report each, both identifying problems with a second transfer when doing persistant transfers re-using a connection. Tim's one is #706624, labeled "Multiple uploads per handle fail" and Michael's #707003 "Does not send Authorization: header when reusing connection". I could track both down to the same piece of logic and it turned out libcurl was not using new settings properly when re-using an existing connection. This concerned both uploading and downloading and involved exactly those pieces these two reports identified. This code has been this faulty since the day I introduced persistant connection support in libcurl, more than 2 years ago. Daniel (20 Mar 2003) - Five year anniversary. Today five years ago, the first ever curl release saw the light of day. Daniel (17 Mar) - Andy Cedilnik corrected flaws in some libcurl example-usage sources. Daniel (16 Mar) - Juan F. Codagnone reported that the fix from March 2nd was incomplete. - Added code to the configure.in to check for select() argument types. I've not made any code use the results just yet though. Daniel (15 Mar) - Gisle Vanem provided two patches to build better on Windows. - Adjusted the test suite code to better make sure that the server(s) required for a specific test is properly started before the test case is attempted. Many tests now run a lot faster than before. Daniel (14 Mar) - Another configure.in adjustment made the configure detect functions properly on HPUX now. Daniel (13 Mar) - Philippe Raoult fixed pre4-compile quirks for FreeBSD. Version 7.10.4-pre4 (13 Mar 2003) Daniel (13 Mar) - Added a backup-check for functions that aren't found by AC_CHECK_FUNCS() as I believe some checks on HPUX need this. At least some of the info given to us by Rick Jones seemed to indicate this. Daniel (12 Mar) - Thomas Tonino found out that if you used the curl tool to do PUT operations as in 'curl www.foo.com/dir/ -T file' and the file name included for example space or other characters that don't belong in URLs, curl did not properly URL encode them before using them in the URL. - Added an option to configure called --enable-libgcc that simply adds -lgcc to the LIBS variable, as this seems to be a common problem. - I modified the configure.in file, so that the headers are now checked in an order of "viality". We must also make sure to use the "default headers" parameter to AC_CHECK_HEADERS() so that headers are checked with the proper prerequisites included (i.e all the major and generally important header files are included there by default). This might be what we need for various Sun, HP, AIX and Tru64 systems to behave good again on the header check front. - Rick Jones pointed out a few compiler warnings on HP-UX that I addressed. - I made the configure --help output nicer by using AC_HELP_STRING() a lot more. Daniel (11 Mar) - Christophe Demory fixed the socket sending code to work better on HP-UX when sending data to a socket that would block. It then returns EAGAIN, not EWOULDBLOCK. - Richard Gorton improved the seeding function for systems without a good and reliable random source. - Richard Gorton fixed a few warnings that popped up when you built curl using the Sun compiler on a 64bit SPARC platform. - Martin C. Martin fixed a case where a connect failure using the multi interface didn't produce a human readable error string. Daniel (10 Mar) - Reverted ltmain.sh back to libtool 1.4.2 status again, as the 1.4.3 version broke the build on numerous platforms. It seems that libtool 1.4.3 puts some requirements on what versions of the other tools (autoconf + automake) that I am not familiar with and thus I couldn't fulfill at this point. Yes, this is more than mildly frustrating. Daniel (7 Mar) - Run libtoolize version 1.4.3. Version 7.10.4-pre3 (4 Mar 2003) Daniel (3 Mar) - Added share.obj to the VC6 and Borland libcurl makefiles. - Troels Walsted Hansen found and investigated a problem with libcurl on AIX, presumably only on 4.3 or later. gethostbyname_r() is not returning data that is possible to "keep" and cache the way libcurl does. But instead these versions of AIX uses a gethostbyname() that works thread-safely we can instead use the ordinary gethostbyname() and our pack_hostent() approach to achieve what we want. The configure script now attempts to detect AIX 4.3 or later to adjust for this. Daniel (2 Mar) - Juan F. Codagnone found a problem introduced in 7.10.3 when you first did a POST and then back to a GET using the same easy handle. Daniel (28 Feb) - Removed the strequal and strnequal defines from curl/curl.h header. They were never meant for the public header anyway. Philippe Raoult brought it up. - James Bursa fixed the RISC OS build. Daniel (27 Feb) - Avery Fay pointed out the very misleading curl_multi_info_read man page, and I updated it to become more accurate. - Salvatore Sorrentino found a problem with FTP downloading that turned out to be his FTP server returning size zero (0 bytes) when SIZE was used on a file while being in BINARY mode. We now make a second check for the actual size by scanning the RETR reply anyway, even if the SIZE command returned 0. Daniel (26 Feb) - Kyle Sallee reported a case where he would do a transfer that didn't update the progress meter properly. It turned out to be a case where libcurl would loop a little too eagerly in the tranfer loop, which isn't really good for the APIs, especially not the multi API. Version 7.10.4-pre2 (24 Feb 2003) Daniel (24 Feb) - Kjetil Jacobsen found out that setting CURLOPT_MAXCONNECTS to a value higher than 5 could cause a segfault. - I believe I fixed the 'Expect: 100-continue' behavior that has been broken for a while (I think since my change dated Dec 10 2002). When this header is used, libcurl should wait for a HTTP 100 (or timeout) before sending the post/put data. Daniel (14 Feb) - Matthew Clarke provided some info what to modify to make curl build flawlessly on AIX 3.2.5. - Martin C. Martin found and fixed a problem in the multi interface when running on Windows and trying to connect to a port without a listener. Daniel (13 Feb) - Christopher R. Palmer fixed Curl_base64_encode() to deal with zeroes in the data to encode. Daniel (4 Feb) - Jean-Philippe added the first code that enables the 'share' system. This should now enable sharing of DNS data between two curl easy handles. - Incorporated Nico Baggus' fixes to again compile flawlessly on VMS. - James Bursa corrected a bad comment in the public include file curl/multi.h - Peter Forret reported one of those error:00000000 cases in libcurl again when connecting to a HTTPS site, and this time I did discover some oddities in how curl reports SSL errors back. It could miss showing the actual error. Version 7.10.4-pre1 (3 Feb 2003) Daniel (3 Feb) - Removed things in the docs saying capath doesn't work on Windows, as Julian Noble told us it works fine. Daniel (31 Jan) - Kevin Roth fixed the zlib build stuff in the Mingw32 makefile. Daniel (30 Jan) - Kevin Roth found out that curl on Windows always checked for the CA cert bundle using the environment variable and the path scan, even though -k/--insecure was used. - Hamish Mackenzie pointed out that curl only did strict host name verifying if capath or cainfo was used. Now it'll always do it unless -k / --insecure is used! - Pavel Cenek pointed out that the Content-Type extraction was done wrongly as the full string was not fetched. Added test case 57 to verify that curl does it right now. Daniel (29 Jan) - Jamie Wilkinson provided a patch that now makes curl attempt to clear out "sensitive" command line arguments so that they don't appear in ps outputs (only on platforms that allow writing to argv[]). - John McGowan found out that the DEBUGFUNCTION could be called with bad arguments and thus cause the --trace outputs to go wrong. - Removed all the emacs local variables from all files. Mats Lidell provided the new sample.emacs file (for a sample of what to include in your .emacs) and the curl-style.el that sets a better c-style for editing curl sources. - Dave Halbakken found a problem with FTP downloads that could accidently return CURLE_PARTIAL_FILE when curl_easy_perform() was called with NOBODY set TRUE. Daniel (27 Jan) - The fopen.c example was flawed as Nick Humfrey noticed, and I fixed it to work again. Daniel (24 Jan) - Bertrand Demiddelaer found and fixed a memory leak (the content-type string) when following locations. Daniel (22 Jan 2003) - Ian Wilkes and Legoff Vincent both independently provided fixes for making curl/multi.h work properly when compiled with a C++ compiler. Daniel (20 Jan 2003) - Fixed 'buildconf' to check version number of the required tools before they're actually used. - Wrote 'testcurl.sh', a script targeted for automatic and distributed curl tests on various platforms. - David Thiel pointed out that the .netrc file was not being dealt with properly anymore. I broke this in the password prompting "fix". - Markus F.X.J. Oberhumer patched libcurl to allocate the scratch buffer only on demand and thus we save 32KB in each curl handle that don't use that buffer. This need appeared when some people started using thousands of simultaneous curl handles... :-) Daniel (16 Jan 2003) - Markus Oberhumer fixed curl-config --cflags when the includedir was not /usr/include. - Markus Oberhumer fixed CURLINFO_PRIVATE to properly return NULL if it was set to NULL! Version 7.10.3 (14 Jan 2003) Daniel (10 Jan 2003) - Steve Oliphant pointed out that test case 105 did not work anymore and this was due to a missing fix for the password prompting. Version 7.10.3-pre6 (10 Jan 2003) Daniel (9 Jan 2003) - Bryan Kemp pointed out that curl -u could not provide a blank password without prompting the user. It can now. -u username: makes the password empty, while -u username makes curl prompt the user for a password. - Kjetil Jacobsen found a remaining connect problem in the multi interface on ipv4 systems (Linux only?), that I fixed and Kjetil verified that it fixed his problems. - memanalyze.pl now reads a file name from the command line, and no longer takes the data on stdin as before. Version 7.10.3-pre5 (9 Jan 2003) Daniel (9 Jan 2003) - Fixed tests/memanalyze.pl to work with file names that contain colons (as on Windows). - Kjetil Jacobsen quickly pointed out that lib/share.h was missing... Version 7.10.3-pre4 (9 Jan 2003) Daniel (9 Jan 2003) - Updated lib/share.c quite a bit to match the design document at http://curl.haxx.se/dev/sharing.txt a lot more. I'll try to update the document soonish. share.c is still not actually used by libcurl, but the API is slowly getting there and we can start implementing code that takes advantage of this system. Daniel (8 Jan 2003) - Updated share stuff in curl/curl.h, including data types, structs and function prototypes. The corresponding files in lib/ were also modified of course to remain compilable. Based on input from Jean-Philippe and also to make it more in line with the design document. - Jean-Philippe Barrette-LaPierre patched a very trivial memory leak in curl_escape() that would happen when realloc() returns NULL... - Matthew Blain provided feedback to make the --create-dirs stuff build properly on Windows. - Fixed the #include in tests/libtest/first.c as Legoff Vincent pointed out. Daniel (7 Jan 2003) - Philippe Raoult provided a patch that now makes libcurl properly support wildcard checks for certificate names. - Simon Liu added CURLOPT_HTTP200ALIASES, to let an application set other strings recognized as "HTTP 200" to allow http-like protocols to get downloaded fine by curl. - Now using autoconf 2.57 and automake 1.7.2 - Doing "curl -I ftp://domain/non-existing-file" still outputed a date! Wayne Haigh reported. - The error message is now written properly with a newline in the --trace file. Daniel (6 Jan 2003) - Sterling Hughes fixed a possible bug: previously, if you called curl_easy_perform and then set the global dns cache, the global cache wouldn't be used. Pointed out by Jean-Philippe Barrette-LaPierre. - Matthew Blain's fixed the VC6 libcurl makefile to include better debug data on debug builds. twittering-mode-3.1.0/win-curl/README_j.txt0000664000175000017500000000415112772521564020236 0ustar tadashitadashicURL + OpenSSL for Windows ƒ}ƒjƒ…ƒAƒ‹ Since: 27-Feb-2002 Version: 1.1 Author: MURAOKA Taro (KoRoN) Last Change: 04-Nov-2003. à–¾ cURL‚̓Rƒ}ƒ“ƒhƒ‰ƒCƒ“‚Å URI/URL ‚ðŽw’肵‚ÄAƒtƒ@ƒCƒ‹‚ðƒ_ƒEƒ“ƒ[ƒh‚·‚éƒ\ƒtƒg ƒEƒFƒA‚Å‚·BƒA[ƒJƒCƒu‚ÉŽû˜^‚³‚ê‚Ä‚¢‚éŽÀsƒtƒ@ƒCƒ‹(curl.exe)‚ÍAƒ\[ƒXƒR[ƒh ‚©‚ç SSL ‚ð—LŒø‚É‚µ‚Ä Visual C++ 6.0 ‚ð—p‚¢‚ăRƒ“ƒpƒCƒ‹‚µ‚½‚à‚̂ł·B SSL ‚Í OpenSSL‚Ì‚à‚Ì‚ðVC6‚ÆNASM 0.98‚ð—p‚¢‚ÄDLL‚Æ‚µ‚ăRƒ“ƒpƒCƒ‹‚µ‚Ü‚µ‚½B Žg‚¢•ûA‹y‚у‰ƒCƒZƒ“ƒX‚ɂ‚¢‚Ä‚ÌÚׂ͈ȉº‚ÌURI‚Æ”z•zƒA[ƒJƒCƒu“à‚Ìdocs/*‚ð ŽQÆ‚µ‚Ä‚­‚¾‚³‚¢B - cURL (7.10.8) http://curl.haxx.se/ - OpenSSL (0.9.7c) http://www.openssl.org/ –{ƒA[ƒJƒCƒu‚͈ȉº‚ÌURI‚ɂĔz•z‚³‚ê‚Ü‚µ‚½B - ‚艮 http://www.kaoriya.net/ - ”z•zŽÒƒ[ƒ‹ƒAƒhƒŒƒX koron@tka.att.ne.jp ‹Œ”Å‚ð‚¨Žg‚¢‚Ì•û‚Ö ¡”Å‚æ‚èDLL‚ðŽg—p‚¹‚¸’P‘Ì‚ÌEXE‚Æ‚µ‚ărƒ‹ƒh‚·‚邿‚¤‚É‚µ‚Ü‚µ‚½B‚»‚Ì‚½‚ß‹Œ”Å‚É ŠÜ‚Ü‚ê‚Ä‚¢‚½ libcurl.dll, libeay32.dll, ssleay32.dll‚Ì3‚‚̃tƒ@ƒCƒ‹‚Í•s—v‚É ‚È‚è‚Ü‚µ‚½B‚±‚ê‚ç‚̃tƒ@ƒCƒ‹‚Í‘¶Ý‚µ‚Ä‚¢‚Ä‚à‰½‚ÌŠQ‚É‚à‚È‚è‚Ü‚¹‚ñ‚ª“¾‚É‚à‚È‚ç ‚¸A‚Ü‚½–³‚­‚Ä‚àcURL‚Ì“®ì‚ÉŽxá‚ð‚«‚½‚·Ž–‚Í‚ ‚è‚Ü‚¹‚ñB‚æ‚Á‚ÄŠeŽ©‚Ì”»’f‚ÅÁ ‚µ‚Ä‚¢‚½‚¾‚¢‚Ä\‚¢‚Ü‚¹‚ñB XV—š—ð 04-Nov-2003 curl‚ð7.10.8‚ɃAƒbƒvƒf[ƒg OpenSSH‚ð0.9.7c‚ɃAƒbƒvƒf[ƒg CA‚ð”z•z•¨‚ɒljÁ 08-Apr-2003 curl‚ð7.10.4‚ɃAƒbƒvƒf[ƒg OpenSSH‚ð0.9.6i‚ɃAƒbƒvƒf[ƒg 23-Jan-2003 curl‚ð7.10.3‚ɃAƒbƒvƒf[ƒg OpenSSH‚ð0.9.6h‚ɃAƒbƒvƒf[ƒg DLL‚ł͂Ȃ­’P‘Ì‚ÌEXE‚Æ‚µ‚ÄƒŠƒrƒ‹ƒh ”z•zƒA[ƒJƒCƒu“à‚Édocs/FAQ‚ð’ljÁ 05-Oct-2002 curl‚ð7.10‚ɃAƒbƒvƒf[ƒg OpenSSH‚ð0.9.6g‚É•ÏX 06-Aug-2002 OpenSSH‚ð0.9.6e‚É•ÏX ------------------------------------------------------------------------------ ¶‚«‚鎖‚Ö‚Ì‹­‚¢ˆÓŽu‚ª“¯Žž‚ÉŽ©•ª‚ƈقȂ鶖½‚ð‚à‘¸‚ÔS‚ƂȂé MURAOKA Taro/KoRoN vim:set ts=8 sts=2 sw=2 tw=78 et ft=memo: twittering-mode-3.1.0/win-curl/curl.exe0000775000175000017500000240000012772521564017675 0ustar tadashitadashiMZÿÿ¸@ິ Í!¸LÍ!This program cannot be run in DOS mode. $'¥ icÄg:cÄg:cÄg:Øk:rÄg:àØi:fÄg: Ûm:hÄg: Ûc:aÄg:cÄg:fÄg:Ût:jÄg:cÄf:òÄg:eçm:"Åg:RichcÄg:PELz™§?à ð ÏA@ ÄTx@.textréð `.rdataR]`@@.data\·` `@À¡”FV‹5FƒÀ PhPÇHÿÖ‹ ”FƒÁ Qh|ÅHÿÖ‹”FƒÂ Rh„ÃHÿÖ¡”FƒÀ PhÐÁHÿÖ‹ ”FƒÁ QhÀHÿÖ‹”FƒÂ Rh¾HÿÖ¡”FƒÀ Ph,¼HÿÖ‹ ”FƒÁ QhXºHÿÖ‹”FƒÄ@ƒÂ Rhh¸HÿÖ¡”FƒÀ Ph ¶HÿÖ‹ ”FƒÁ Qhä´HÿÖ‹”FƒÂ Rh ³HÿÖ¡”FƒÀ PhH±HÿÖ‹ ”FƒÁ Qh|¯HÿÖ‹”FƒÂ RhÀ­HÿÖ¡”FƒÀ PhÜ«HÿÖ‹ ”FƒÄ@ƒÁ Qhè©HÿÖ‹”FƒÂ Rh¨HÿÖ¡”FƒÀ Ph(¦HÿÖ‹ ”FƒÁ Qh8¤HÿÖ‹”FƒÂ Rhh¢HÿÖ¡”FƒÀ Ph˜ HÿÖ‹ ”FƒÁ QhÀžHÿÖ‹”FƒÂ RhØœHÿÖ¡”FƒÄ@ƒÀ Ph ›HÿÖ‹ ”FƒÁ Qh ™HÿÖ‹”FƒÂ RhL—HÿÖ¡”FƒÀ PhX•HÿÖ‹ ”FƒÁ Qhh“HÿÖ‹”FƒÂ Rhˆ‘HÿÖ¡”FƒÀ PhœHÿÖ‹ ”FƒÁ Qh°HÿÖ‹”FƒÄ@ƒÂ Rh¸‹HÿÖ¡”FƒÀ Phð‰HÿÖ‹ ”FƒÁ QhˆHÿÖ‹”FƒÂ Rh,†HÿÖ¡”FƒÀ PhT„HÿÖ‹ ”FƒÁ Qh˜‚HÿÖ‹”FƒÂ Rhä€HÿÖ¡”FƒÀ PhHÿÖ‹ ”FƒÄ@ƒÁ QhD}HÿÖ‹”FƒÂ Rh{HÿÖ¡”FƒÀ Ph yHÿÖ‹ ”FƒÁ QhÈwHÿÖ‹”FƒÂ RhvHÿÖ¡”FƒÀ Ph4tHÿÖ‹ ”FƒÁ QhtrHÿÖ‹”FƒÂ Rh€pHÿÖ¡”FƒÄ@ƒÀ Ph”nHÿÖ‹ ”FƒÁ QhÌlHÿÖ‹”FƒÂ RhüjHÿÖ¡”FƒÀ Ph8iHÿÖ‹ ”FƒÁ QhLgHÿÖ‹”FƒÂ Rh„eHÿÖ¡”FƒÀ Ph˜cHÿÖ‹ ”FƒÁ Qh¨aHÿÖ‹”FƒÄ@ƒÂ RhÈ_HÿÖ¡”FƒÀ Phü]HÿÖ‹ ”FƒÁ Qh,\HÿÖ‹”FƒÂ RhXZHÿÖ¡”FƒÀ Ph¤XHÿÖ‹ ”FƒÁ QhÈVHÿÖ‹”FƒÂ RhàTHÿÖ¡”FƒÀ PhøRHÿÖ‹ ”FƒÄ@ƒÁ QhQHÿÖ‹”FƒÂ Rh8OHÿÖ¡”FƒÀ PhDMHÿÖ‹ ”FƒÁ Qh\KHÿÖ‹”FƒÂ RhŒIHÿÖ¡”FƒÀ PhÌGHÿÖ‹ ”FƒÁ QhFHÿÖ‹”FƒÂ Rh0DHÿÖ¡”FƒÄ@ƒÀ PhlBHÿÖ‹ ”FƒÁ Qh¨@HÿÖ‹”FƒÂ RhÔ>HÿÖ¡”FƒÀ Ph =HÿÖ‹ ”FƒÁ Qh<;HÿÖ‹”FƒÂ Rh€9HÿÖ¡”FƒÀ Ph˜7HÿÖ‹ ”FƒÁ Qh¨5HÿÖ‹”FƒÄ@ƒÂ Rh´3HÿÖ¡”FƒÀ Phð1HÿÖ‹ ”FƒÁ Qh0HÿÖ‹”FƒÂ Rh`.HÿÖ¡”FƒÀ Pht,HÿÖ‹ ”FƒÁ Qh *HÿÖ‹”FƒÂ RhÀ(HÿÖ¡”FƒÀ Phà&HÿÖ‹ ”FƒÄ@ƒÁ Qh %HÿÖ‹”FƒÂ Rh\#HÿÖ¡”FƒÀ PhŒ!HÿÖ‹ ”FƒÁ Qh¤HÿÖ‹”FƒÂ RhäHÿÖ¡”FƒÀ PhHÿÖ‹ ”FƒÁ QhPHÿÖ‹”FƒÂ Rh˜HÿÖ¡”FƒÄ@ƒÀ Ph¤HÿÖ‹ ”FƒÁ Qh´HÿÖ‹”FƒÂ RhøHÿÖ¡”FƒÀ Ph$HÿÖ‹ ”FƒÁ Qh4HÿÖ‹”FƒÂ Rhx HÿÖ¡”FƒÀ Ph´ HÿÖ‹ ”FƒÁ QhØ HÿÖ‹”FƒÄ@ƒÂ RhüHÿÖ¡”FƒÀ PhHÿÖ‹ ”FƒÁ Qh`HÿÖ‹”FƒÂ Rh HÿÖ¡”FƒÀ Ph¸HÿÖ‹ ”FƒÁ QhàþGÿÖ‹”FƒÂ Rh ýGÿÖ¡”FƒÀ PhTûGÿÖ‹ ”FƒÄ@ƒÁ QhtùGÿÖ‹”FƒÂ Rh”÷GÿÖ¡”FƒÀ Ph¸õGÿÖ‹ ”FƒÁ QhÜóGÿÖ‹”FƒÂ RhäñGÿÖ¡”FƒÀ PhüïGÿÖ‹ ”FƒÁ Qh,îGÿÖ‹”FƒÂ Rh<ìGÿÖ¡”FƒÄ@ƒÀ PhdêGÿÖ‹ ”FƒÁ QhœèGÿÖ‹”FƒÂ RhÌæGÿÖ¡”FƒÀ Ph åGÿÖ‹ ”FƒÁ QhPãGÿÖ‹”FƒÂ Rh„áGÿÖ¡”FƒÀ PhßGÿÖ‹ ”FƒÁ QhÀÝGÿÖ‹”FƒÄ@ƒÂ RhèÛGÿÖ¡”FƒÀ Ph ÚGÿÖ‹ ”FƒÁ Qh0ØGÿÖ‹”FƒÂ Rh<ÖGÿÖ¡”FƒÀ PhtÔGÿÖ‹ ”FƒÁ QhÀÒGÿÖ‹”FƒÂ RhÑGÿÖ¡”FƒÀ Ph,ÏGÿÖ‹ ”FƒÄ@ƒÁ Qh`ÍGÿÖ‹”FƒÂ RhœËGÿÖ¡”FƒÀ Ph¬ÉGÿÖ‹ ”FƒÁ QhÀÇGÿÖ‹”FƒÂ RhüÅGÿÖ¡”FƒÀ Ph(ÄGÿÖ‹ ”FƒÁ QhPÂGÿÖ‹”FƒÂ RhÀGÿÖ¡”FƒÄ@ƒÀ PhܾGÿÖ‹ ”FƒÁ Qhø¼GÿÖ‹”FƒÂ RhL»GÿÖ¡”FƒÀ Phd¹GÿÖ‹ ”FƒÁ Qh|·GÿÖ‹”FƒÂ Rh˜µGÿÖ¡”FƒÀ Ph´³GÿÖ‹ ”FƒÁ QhرGÿÖ‹”FƒÄ@ƒÂ Rh°GÿÖ¡”FƒÀ Phl®GÿÖ‹ ”FƒÁ Qh¤¬GÿÖ‹”FƒÂ Rh°ªGÿÖ¡”FƒÀ Ph̨GÿÖ‹ ”FƒÁ Qh$§GÿÖ‹”FƒÂ RhL¥GÿÖ¡”FƒÀ PhŒ£GÿÖ‹ ”FƒÄ@ƒÁ QhÄ¡GÿÖ‹”FƒÂ Rh GÿÖ¡”FƒÀ PhžGÿÖ‹ ”FƒÁ Qh0œGÿÖ‹”FƒÂ RhdšGÿÖ¡”FƒÀ Php˜GÿÖ‹ ”FƒÁ Qh|–GÿÖ‹”FƒÂ Rhˆ”GÿÖ¡”FƒÄ@ƒÀ Ph”’GÿÖ‹ ”FƒÁ Qh¼GÿÖ‹”FƒÂ RhGÿÖ¡”FƒÀ Ph\GÿÖ‹ ”FƒÁ Qh„‹GÿÖ‹”FƒÂ Rh°‰GÿÖ¡”FƒÀ Phè‡GÿÖ‹ ”FƒÁ Qh,†GÿÖ‹”FƒÄ@ƒÂ Rh\„GÿÖ¡”FƒÀ Ph˜‚GÿÖ‹ ”FƒÁ Qh €GÿÖ‹”FƒÂ Rh´~GÿÖ¡”FƒÀ PhÜ|GÿÖ‹ ”FƒÁ QhèzGÿÖ‹”FƒÂ Rh0yGÿÖ¡”FƒÀ Ph`wGÿÖ‹ ”FƒÄ@ƒÁ QhxuGÿÖ‹”FƒÂ Rh¬sGÿÖ¡”FƒÀ PhàqGÿÖ‹ ”FƒÁ QhpGÿÖ‹”FƒÂ Rh,nGÿÖ¡”FƒÀ PhHlGÿÖ‹ ”FƒÁ QhtjGÿÖ‹”FƒÂ RhˆhGÿÖ¡”FƒÄ@ƒÀ Ph¨fGÿÖ‹ ”FƒÁ QhÀdGÿÖ‹”FƒÂ RhÐbGÿÖ¡”FƒÀ Phä`GÿÖ‹ ”FƒÁ Qh`GÿÖƒÄ(^ÃU‹ìƒäøƒì¡”FSV‹u X WЉ\$„À„nŠ<%…èŠF<%uSj%ÿœFƒÄƒÆé@<{…ªj}Vÿ˜FƒÄ‰D$…À„’ŠÆ¡8ÉHƒÆ3ÛˆL$…À„a¸8ÉH‹ø‹RVè»sƒÄ…Àu#‹OƒÇC‹Ç…Éuã‹D$ŠL$‹\$pˆéË‹Ý<ÉHCÿƒø ‡ÿ$…Ì"@‹MD$PhQèDsƒÄ …À…ï‹D$…À„ãéÏ‹MD$Ph QèsƒÄ …À…À‹T$‹D$RhœÊHPèÆp‹D$(ŠL$‹\$ƒÄ pˆé7‹UL$Qh RèÊrƒÄ …À…u‹D$‹L$Ph˜ÊHQè{p‹D$(ŠL$‹\$ƒÄ pˆéì‹ET$Rh PèrƒÄ …À…*‹L$‹T$Qh˜ÊHRè0p‹D$(ŠL$‹\$ƒÄ pˆé¡‹MD$ Ph0Qè4rƒÄ …À…ß‹T$$‹D$ ‹L$RPhÊHQèào‹D$,ŠL$‹\$ ƒÄpˆéQ‹ET$ Rh0PèäqƒÄ …À…‹L$$‹T$ ‹D$QRhÊHPèo‹D$,ŠL$‹\$ ƒÄpˆé‹UL$ Qh0Rè”qƒÄ …À…?‹D$$‹L$ ‹T$PQhÊHRè@o‹D$,ŠL$‹\$ ƒÄpˆé±‹MD$ Ph0QèDqƒÄ …À…ï‹T$$‹D$ ‹L$RPhÊHQèðn‹D$,ŠL$‹\$ ƒÄpˆéa‹ET$ Rh0PèôpƒÄ …À…Ÿ‹L$$‹T$ ‹D$QRhÊHPè n‹D$,ŠL$‹\$ ƒÄpˆé‹UL$ Qh0Rè¤pƒÄ …À…O‹D$$‹L$ ‹T$PQhˆÊHRèPn‹D$,ŠL$‹\$ ƒÄpˆéÁ‹MD$ Ph0QèTpƒÄ …À…ÿ‹T$$‹D$ ‹L$RPhˆÊHQèn‹D$,ŠL$‹\$ ƒÄpˆéq‹ET$ Rh 0PèpƒÄ …À…¯‹L$$‹T$ ‹D$QRhÊHPè°m‹D$,ŠL$‹\$ ƒÄpˆé!‹UL$ Qh 0Rè´oƒÄ …Àuc‹D$$‹L$ ‹T$PQhÊHRèdm‹D$,ŠL$‹\$ ƒÄpˆéÕ‹MD$PhQèhoƒÄ …Àu‹D$…Àt‹T$RPÿFƒÄ‹D$ŠL$‹\$pˆ鎋=œFSj%ÿ×¾VSRÿ׃ăÆës<\u`¾FƒèntFƒèt0ƒèSt‹=œFj\ÿ×¾FSPÿ׃ăÆëAj ÿœFƒÄƒÆë1Sj ÿœFƒÄƒÆë Sj ÿœFƒÄƒÆë¾ÈSQÿœFƒÄF€>…’úÿÿ_^[‹å]Ëÿ@i@¹@ @Y @ù @© @I!@™!@8@ƒ@Î@ @å!@S‹\$ UVW‹ûƒÉÿ3Àò®‹5¤F÷ÑQÿÖ‹èƒÄ…íuhÀÊHjPhJèªiƒÄ ¸_^][ÃhìÿÖ‹ðƒÄ…öu%Uÿ FhÀÊHjPhJèuiƒÄ¸_^][ËûƒÉÿ3ÀdžÜò®ˆ†èD$÷ÑPjISV‰Žà‰®äèrƒÄ…Àu‹L$‹T$‹D$_‰‰0^]3À[Ë= FUÿ×Vÿ׋L$$‹D$(ƒÄ…ÀÇtŠ J„ÉthJjh¤ÊHPèkƒÄ_^]¸[ËD$S‹\$U‹l$V‹t$‹“äÇWŠÇD$„Àt@<{t<<[t8<}t[<]tW<\u ŠN€ù{t€ù[t €ù}t€ù]u ŠFFE„Àt3ˆŠFBFE„ÀuÀÆ‹ƒÜ‹‹ä™+ÂQ‹øÑÿÿŒFƒÄ‰»…Àu _^]¸[Ë“ÜB‰“ÜŠ<[t<{uF‹T$ ERFUVSèKƒÄ‹ðë‹D$ EPFUVSèUƒÄ‰D$‹ð…öt‹ »Qÿ FƒÄ‹Æ_^][Ët$‹Æ_^][ÃSU‹l$ VW‹…Ü‹ä™+ÂÑøƒÀ€t…3ÀPÇf‰Ff‰F ÿ¤F‹|$‰F‹…܃Ä@‰…ܾƒø}w|3ÉŠˆÜ&@ÿ$Ä&@Æ‹N¿V•PQÿ¨FƒÄ‰F…Àtv‹•äRÿŒF¿N‹VƒÄ‰ŠfÿF€?}tq‹D$‹äG@‰D$둊C„À„“‹D$G@‰D$Šˆ‹D$CG@‰D$éhÿÿÿ‹L$QhËHës‹T$RhìÊHëghÀÊHjPhJèžfƒÄ ¸_^][ËL$D$APGQWUè¾ýÿÿƒÄƒø¸t‹D$¿V¯Ð‹D$ _^]‰3À[ËL$Që‹T$RhÐÊHjPhJè‹û‹ ¸Fƒ9~¾jPGÿ´FƒÄë¡°F¾‹ŠQƒàG…ÀtfÿF ëÈ‹|$‹Uj]S‰Vÿ˜FƒÄ…ÀtC‹t$ @‹ÐL$+ÓQÖRP‹D$$PèèúÿÿƒÄƒøu‰D$‹‹U+Ê‹T$$A_¯L$ ^]‰ 3À[YÃh ËHjPhJèpcƒÄ ¸_^][YËD$ PhdËHë ‹L$ Qh0ËHjPhJè@cƒÄ¸_^][YÃSU‹l$ V‹ÜKxVW‹ÃöÙu +ÂÑø‹D…Pë5+ÂÑøL€ ƒ|u/€¿t•0|•Nx‹G,‹ °Qÿ FƒÄNyí‹W,Rÿ FƒÄKy¬_‹…ä‹5 FPÿÖUÿÖƒÄ^][ÃSUVW‹|$Š‡è‹¯ä„Àu\Ƈ苇Ü3Û…ÀŽx‹Ëá€yIƒÉþA‹Ã™…Ï+ƒÉÿÑø‹‡3À‹úò®÷Ñ+ù‹Á‹÷‹ýÁéó¥‹Èƒáó¤‹ú鋇ܾ™+ÂÑøH €L8…À|w‹Qð3öJt0JtJuP‹‹YøB;Ó‰~7‹Qô‰ë+ŠQöŠYõþÂ:ÓˆQö~!ŠQôˆQöëfÿAúf‹Qúf;Qøu fÇAú¾Hƒé…öu£é1ÿÿÿ‹AðPhüËHèÄcƒÄjÿ¼F…ö„ÿÿÿ_^]3À[Ã+ÂÑøƒÀ €‹Ht.Ht"H…¿J ‹BPQhôËHUè)cƒÄ‹ýë:ŠRˆUEëA¿B ‹J‹<ƒÉÿ3Àò®÷Ñ+ù‹Á‹÷‹ýÁéó¥‹Èƒáó¤¿J ‹R‹<ŠƒÉÿ3Àò®‹|$÷ÑI鋇ÜC;ØŒˆþÿÿÆE‹äQÿŒFƒÄ_^][ËPhüËHèóbƒÄjÿ¼Fƒì8SUVW‹|$LƒÉÿ3ÀÇD$ò®÷ÑIQ‰L$ ÿ¤FƒÄ‰D$…Àu_^][ƒÄ8ËL$LŠ„À„w‹\$L<#…þ¡¸Fƒ8~¾IjQÿ´F‹L$TƒÄë¡°F¾Q‹ŠPƒà…À„ÅT$Lj ARQÿÀFƒÄ Hÿ…À„¶‹t$P‹†Ü™+ÂÑø;ÈŸD‰ ¹|$44†ó¥‹L$4‹ÁHtXHt>H…í¿T$@‹L$DD$ QRhôËHPèaL$0|$0‰L$$ƒÉÿ3ÀƒÄò®÷ÑI‹ÙëCŠT$:D$ ˆT$ ÆD$!‰D$ë'¿L$>‹T$83À‹<ŠƒÉÿ‰|$ò®÷ÑI‹Ùë‰L$A‰L$L»‹D$,‹D$;è|‹t$D-PV‰D$$ÿ¨FƒÄ…Àtl‰D$‹T$‹D$‹t$‹Ë<‹ÑÁéó¥‹Ê‰l$ƒáó¤‹L$LŠ„À…þÿÿ‹D$‹L$_^]Æ[ƒÄ8ÃQhüËHèa‹D$Pÿ FƒÄ 3À_^][ƒÄ8ÃVÿ FƒÄ3À_^][ƒÄ8Ãjè9aƒÄÃéËa‹L$‹T$‹…Àt ;Ât¡”Fh(ÌHƒÀ@Pè»`ƒÄ¸É3ÀËD$V‹p|…öt?S‹ FW‹F‹>…ÀtPÿӃċF…ÀtPÿӃċF …ÀtPÿÓƒÄVÿӃċ÷…ÿuË_[^Ãjÿ¤F‹T$ƒÄ…À‹Š€t,VW‹ø3ö…ɉ7‰w‰w‰w ‰w_^t ‰‰‚€Ã‰B|‰‚€ÃV‹t$W‹~…öt%‹F…Àu‹hPÌHPÿÐFƒÄ‰F…Àu_ƒÈÿ^ˇS…Àth‹ÌFUjÿÓ‹—$‹·‹È‹î+Ê‹T$¯T$ ¯éƒÄ;Õ]v-’3Ò€€Áà÷ö‹Ð‰€€Áà+ÐRèLjÿӃċt$‰‡$‹N‹T$‹D$Q‹L$RPQÿÈF‹ØŠ‡ÍƒÄ„Àt ‹VRÿÄFƒÄ‹Ã[_^ËD$Pÿ\FËD$V‹p‹†…À„S‹ÌFUWjÿÓ‹–‹¾‹È‹ï+Ê‹– ¯éƒÄ;Õv-’3Ò€€Áà÷÷‹Ð‰€€Áà+ÐRè…ÿÿÿjÿӃċL$‰†‹D$‹ù¯ø‹–;ú_][v‹Â¹‹Ñ¯Ð‰– ë‹D$‹L$ ‹T$‹RP‹D$QPÿÔFƒÄ^ÃU‹ìƒäøìDSV‹uWÛF‹@ÙÀÜE ‰ÜEÝ\$ÜEÜE$Ý\$ÝHFÜ\$ßàöÄ@tPÝFèY™ÝD$âÿ‹øÁÿ èB™âÿÂÁø ;Ç޼+Ç‹ø‹FhlÌHPèº]ƒÄOuìéŸÝD$Üt$‹^ƒë‰\$ÙÀÜ @FÝ\$ ÛD$ØÉèè3ɉD$…ÀÝØ~‹È¸####‹Ñ|$PÁéó«‹Êƒáóª‹ÊSD$,hXÌHPÆD \èÊ\‹L$0‹T$,QD$`RL$-udVhèÐHè˜\ƒÄ…ÀtÆD$ëm‹Œ$„I;Ù}‹T$ ‹ë3ÀL$UQPV觃ĉD$…À…¤ŠD$„Àt3‹L$ CƒÁƒÇ‰L$ ë"‹T$WURPhàÐHèlƒÄ‰D$…À…y‹T$ ‹„$„CƒÂƒÇ;؉T$ ŒMÿÿÿ3ÿ‹E|;Ç„]9x„T9} …†èrPhÈÐH”$h€Rè3W„$ ƒÄ‰E ë_‹L$Aÿƒøw5ÿ$…H@Vh°ÐHëVh˜ÐHëVhpÐHëVhPÐHëVhÐHè&ƒÄUè}øÿÿƒÄ¸_^][ÄlÃÆD$+‹…˜˜;ÇuE9½œu=Š…Ð„Àu3h ÐHèùp‹ðƒÄ;÷tVSèVèžƒÄ ëhøÏHUè3BƒÄ‹E,;Ç‹= F„‚ŠÏ„ÉtSPÿŒF‹M,‹ðQ‰t$4ÿ×ÇE,‹Ex%•÷ØÀR÷Ø@Pè÷ÿÿƒÄ…Àt;Vÿ׃ĸ_^][ÄlÃQjèT÷ÿÿƒÄ…Àt_^]¸[ÄlÃèHY‹ð…öuUèl÷ÿÿƒÄ¸_^][ÄlËU|‰T$ ‹UH…ÒtP¿ôÏH‹ÂŠŠË:u„ÉtŠXŠË:_uƒÀƒÇ„Éuà3ÀëÀƒØÿ…Àt‰T$t3Àë¡”FƒÀ ‰D$@‰D$x‰l$|‹D$ …À„Y‹D$…À…M‹\$ ‹{…ÿ‰|$pu‹C…Àt Pÿ FƒÄ‹;Sé‹ ”F‰l$`ƒÁ ‰L$\‹C…ÀtPÿŒFƒÄ‹Øë3Û‹T$ ‰\$4‹B ‰D$DŠ…Î„ÀuM‹D$D…ÀtEŠEd„Àt‹…Ü…Àu ‹ ”FA@ë3ÀP‹D$H”$”L$TRPQè¼êÿÿƒÄ‰D$…À…ÀÇD$<‹D$<…Àu‹D$D…Àt6‹D$P…ÀtPè·ñÿÿë‹D$<…À…ß ‹T$DRÿŒFƒÄ‰D$$…À„Ï Š…ÎÇD$dÿÿÿÿ„ÀuCŠEd„Àt‹…Ü…Àu ¡”FƒÀ@ë3À‹T$pL$LPQD$@RPèêÿÿƒÄ‰D$…À…| ëÇD$L…ÛthôÏHSècXƒÄ…Àt‹D$LÇD$hƒøÇD$hÇD$H‹D$8…ÀtPèíðÿÿë‹D$H…À…” WÿŒF‹øƒÄ…ÿ‰|$„Ï …Ût‹L$4QÿŒFƒÄ‹Øë3Û‹T$ ‰\$öBu…Û„&ShôÏHèÎWƒÄ…À……Ûua‹|$hðÏHWÿäFƒÄ…ÀtƒÀë‹Çj/PÿàFƒÄ…À„ ŠH@„É„ú PÿŒF‹ØƒÄ…Û‰\$„â €;„Ù ë-‹D$8…Àt!PS‹ûèíñÿÿ‹ØW‰\$(ÿ FƒÄ …Û„Ì ‹|$Š…Ñ„ÀtSè±?ƒÄƒøÿ„Ñ ŠE%„Àt)„$´PSÿ FƒÄ…Àu ‹Œ$ȉM(ëÇE(‹E(…ÀthìÏHSÿÐFƒÄ‰D$\…À„q ë‰\$XÇD$\ë‹|$‹D$$ÆD$…À„—‹ÐhôÏHRè‘VƒÄ…À…QhðÏHWÿäFƒÄ…ÀtƒÀë‹Çj/PÿàFƒÄ‰D$0…Àt@ƒÉÿ‰D$0‹ø3Àò®÷ÑI…¹‹\$$j/SÿàF‹øƒÄ…ÿu‹Ãj\PÿàFƒÄ…Àtxë …ÿtGë‹ûjWèCj‹ØƒÄ…Ûtr‹ûƒÉÿ3Àò®‹|$÷ÑI‹ÑƒÉÿò®÷ÑID Pÿ¤F‹øƒÄ…ÿ„² ‹D$0S…Àt ‹L$QhäÏHë ‹T$RhÜÏHWèÓRƒÄS蚘‹D$Pÿ FƒÄ‰|$‹|$$hØÏHWÿÐFƒÄ‰D$0…À„5 Œ$ØQWÿ FƒÄ…À… ‹”$ì‹\$‹|$ÆD$‰T$dë ‹D$$hôÏHPè&UƒÄ…Àt ‹ ”F‰L$0ŠE%„ÀtÇE(ÿÿÿÿ‹D$\…ÀtPÿ´FPÿ¸FƒÄ…Àt ‹Ex€Ì‰Ex‹L$Lƒù~Q÷ExuH…Û‹Ãu¸ÌÏH‹T$HP¡”FWBQRƒÀ@h´ÏHPèXR‹„$€ƒÄ…ÀtWh¨ÏHh ÏHè RƒÄ ‹D$,…À„ÇhðÏHWÿäFƒÄÆD$?…ÀtƒÀë‹Çj/PÿàF‹ØƒÄ…Ûtj?Sÿ˜FƒÄ…ÀtÆD$&‹|$,ƒÉÿ3Àò®‹|$÷ÑI‹ÑƒÉÿò®÷ÑID Pÿ¤F‹øƒÄ…ÿ„ë ‹L$,…ÛQt¾T$‹D$RPh˜ÏHWèQƒÄë‹T$RhÏHWèýPƒÄ‹D$Pÿ F‹\$ ƒÄ‰|$‹…Ü…Àu‹ ”FƒÁ@‰Ü…Ûu+÷Exu"‹”Fh€ƒÂ Rÿ´FƒÄPÿXFƒÄ‹…¬Phi'VèjRjjZVè`RL$pQh'VèPRh0/@h+NVè@R‹T$`„$°Ph'V‰”$¼‰¬$ÀèRh 0@h,NVè R‹…ƒÄH…Àt PjbVèõQƒÄ ‹L$dQjVèåQWh'VèÙQ‹UpRh'VèÊQ‹Ex%Pj*Vè¹Q‹MxáQj+Vè§Q‹UxâRj,Vè•Q‹ExƒÄH%Pj-VèQ‹T$03É…Ò•ÁQj.VèmQ‹UxâRj0Vè[Q‹Ex%Pj2VèJQ‹ExƒÄ0© tjë ©@tjëjj3Vè$Q‹MxƒÄ á€Qj4VèQ‹Uxâ@RjiVèýP‹Ex%Pj5VèìP‹MxáQj7VèÚP‹UhRh'VèËP‹ElPh'Vè¼P‹MXƒÄHQh'VèªP”$ˆRh'Vè—P‹E8Pj Vè‹P‹M,Qh'Vè|P‹U0RjOƒÄ ‹…œ…ÀtPhq'Vè%OƒÄ jj@VèOƒÄ Š…Ð„Àtjj@VèOjjQVè÷NƒÄ‹ExöÄu€}tjhU'VèÙNƒÄ ‹E@…ÀtPëj2jDVèÂN¾•°ƒÄ RjVè¯N‹…äPh,'VèN‹èQh7'Vè‹N‹UH„$˜÷ÚÒ#ÐRh-'VèoN‹MQh/'Vè`N‹EƒÄ<…ÀtPhb'VèJNƒÄ ¾URj`Vè:N‹…ðPj Vè+N‹øQj!VèN‹•üRj"Vè N‹…´Ph4'VèûM‹ÜQh5'VèéM¾UuƒÄHRj=VèÙM‹EPPhN'VèÊM‹¸QhO'Vè¸MŠ…ÌƒÄ$<u=÷Exu4”$”URèÄ2hð0@hXNVè„M„$¨PhI'VèqMƒÄ ‹ QhV'Vè\M‹URh\'VèMM‹EPh]'Vè>M‹MhÑHèÖ-‹ õIƒÄ‹q ‹…ÀtPhŒÑHè¹-‹FƒÆƒÄ…ÀuèhõIÿՃċ õI‹B…À„Ôh€ÑHÇD$0xÑHÇD$4ÇD$8´ÕHÇD$<ÇD$@tÑHÇD$DÇD$HlÑHÇD$LÇD$PdÑHÇD$TÇD$XTÑHÇD$\ ÇD$`LÑHÇD$d@ÇD$h@ÑHÇD$l€ÇD$p8ÑHÇD$tè÷,ƒÄt$,¿ ‹ õI‹F…At‹RhŒÑHèÐ,ƒÄƒÆOuÜhõIÿÕƒÄ_^]¸[ÄÀÃ_^]¸[ÄÀÃ_^]3À[ÄÀø_^][ÄÀÃþW@TU@ X@X@(X@7X@FX@UX@pX@½X@ÛX@äY@'Z@~[@´[@À[@ð[@D\@k\@æ`@Â\@Î\@V]@q]@ä]@ó]@^@·^@û`@n_@¯_@dX@‚X@ÉX@"Y@öY@r[@¨[@Á`@Û[@ç[@8\@_\@“\@\@h]@b`@Ò]@ì]@ü]@”^@Ú^@ã^@\_@ƒ_@Û_@pb@8888888888888888888888 888888888 !"#$%&'()*+,-./01234567lU@~U@U@ªU@¿U@”W@ÈU@ÝU@ùU@pV@yV@…V@‘V@V@©V@”W@µV@ÁV@ÍV@ÖV@âV@îV@ZW@lW@W@‹W@4V@\V@HV@_V@?Z@TZ@iZ@~Z@“Z@®Z@ÃZ@숸|íHÇD$DíH‰D$ÇD$íHÇD$ ÈìHÇD$„ìHÇD$4ìHÇD$øëHÇD$ÌëHÇD$ „ëHÇD$$PëHÇD$((ëHÇD$,ôêHÇD$0ÀêHÇD$4€êHÇD$8DêHÇD$<êHÇD$@ÌéHÇD$D”éHÇD$HXéHÇD$L4éHÇD$PìèHÇD$T¨èHÇD$XxèHÇD$\8èHÇD$`üçHÇD$dÌçHÇD$hŒçHÇD$lDçHÇD$pçHÇD$tìæHÇD$x¤æHÇD$|`æHÇ„$€ æHÇ„$„ìåHÇ„$ˆ¨åHÇ„$ŒhåHÇ„$(åHÇ„$”àäHÇ„$˜¤äHÇ„$œ€äHÇ„$ HäHÇ„$¤äHÇ„$¨ØãHÇ„$¬ãHÇ„$°PãHÇ„$´ ãHÇ„$¸ÀâHÇ„$¼ˆâHÇ„$ÀLâHÇ„$ÄâHÇ„$ÈàáHÇ„$̘áHÇ„$ÐláHÇ„$Ô,áHÇ„$ØìàHÇ„$ܬàHÇ„$à€àHÇ„$ä@àHÇ„$èàHÇ„$ìÌßHÇ„$ðßHÇ„$ôPßHÇ„$ø ßHÇ„$üÄÞHÇ„$„ÞHÇ„$@ÞHÇ„$üÝHÇ„$ ´ÝHÇ„$lÝHÇ„$(ÝHÇ„$äÜHÇ„$¬ÜHÇ„$ \ÜHÇ„$$ÜHÇ„$(ìÛHÇ„$,¨ÛHÇ„$0dÛHÇ„$4$ÛHÇ„$8èÚHÇ„$<¨ÚH‹ÈÇ„$@pÚH…ÉÇ„$D0ÚHÇ„$HøÙHÇ„$LÄÙHÇ„$PˆÙHÇ„$TPÙHÇ„$XÙHÇ„$\ÌØHÇ„$`|ØHÇ„$d@ØHÇ„$hØHÇ„$lô×HÇ„$pÐ×HÇ„$t¬×HÇ„$xx×HÇ„$|D×HÇ„$€×HÇ„$„tVW‹=èFt$Pÿ׋FƒÆƒÄ…Àuð_^ĈÃì‹„$UV3í3ö…À‰t$„âPD$hPÿðFƒÄ …À„»SWë‹t$‹=˜FL$j Qÿ׃Ä…ÀtÆT$j Rÿ׃Ä…ÀtÆ|$ƒÉÿ3Àò®÷ÑI…í‹ÙtD3PUÿ¨FƒÄë KQÿ¤FƒÄ‹è|$ƒÉÿ3Àò®÷Ñ+ù.‹Á‹÷‹úT$Áéó¥‹È‹D$ƒáÃ󤋌$‰D$QhRÿðFƒÄ …À…Kÿÿÿ_[‹Å^]ÄÃ^3À]ÄÃì‹„$UW3í3ÿ…À‰|$„ŸSVPhD$jPÿÔF‹ØƒÄ…Ûtk…ít QUÿ¨FƒÄ…ÀtUë Sÿ¤FƒÄ‹Ë‹è‹Ñt$ý‹D$Áéó¥‹ÊÃá‰D$‹„$ó¤PhL$jQÿÔF‹|$ ‹ØƒÄ…Ûu•‹”$^[‹Å‰:_]ÄÃ_3À]ÄÃìSUV‹´$$W‹þƒÉÿ3Àò®÷ÑIQÿ¤F‹ø„$(WPhHîHV‰|$(Æÿ¬FƒÄƒøŒðŠ<@…,‹-˜Fw3À‰t$‰D$ ‰D$j;V3ÛÿÕj,V‹øÿՃąÀt;Çs‹ø…ÿÇD$„ €?,u3öëw…öÆ„ï€>,„â‹ ¸Fƒ9~¾jRÿ´FƒÄë‹ °F¾‹ŠBƒà…ÀtFëÌjVh@îHè5&ƒÄ …ÀtY„$¤L$$PƒÆQh,îHV‰t$,ÿ¬FƒÄƒø…¿|$$ƒÉÿ3Àò®÷ÑI¼$¤‹ÑƒÉÿò®÷ÑIòD1Æpë7j Vh îHèÈ%ƒÄ …Àt-^ j;SÿÕ‹ðƒÄ…öuj,SÿÕ‹ðƒÄ…ötÆF…ö…ÿÿÿë…öu3öëj,VÿÕ‹ðƒÄ…ötÆF‹T$D$ L$P‹D$QSRP蠃ąÀtR…ö‰t$„‚€>t}é‚þÿÿ‹ ”FhôíHƒÁ@Qè¿"‹T$Rÿ F‹D$PèƒÄ¸_^][ÄË ”FhØíHƒÁ@Qèƒ"‹T$Rÿ F‹D$Pèރĸ_^][ÄËD$…À„ø3ÿ‹@G…Àuø ýQÿ¤F‹ðƒÄ…öu<‹”FhØíHƒÂ@Rè"‹D$Pÿ F‹L$QèuƒÄ¸_^][ÄËD$…ÿv‹Î‹×‹‰‹X‰Y‹@ƒÁJuíÇþ‹T$Rè2‹Œ$4‹”$0jV„$0jPjQRè*ƒÄ …Àt6¡”FhÀíHƒÀ@Pè„!V‹5 FÿÖ‹L$ Qÿփĸ_^][ÄÃVÿ FƒÄ‹|$Wÿ FƒÄ3À_^][ÄÃ<„À‹ît5‹ ¸Fƒ9~ ¾ÐjRÿÓƒÄë‹ °F¾À‹ŠBƒà…ÀuŠFF„ÀuËÆ‹„$,‹T$L$PQURè Õÿÿ‹øŠEƒÄ„ÀtŠD$„Àu¿ë…ÿ„ª‹Œ$(¾ôÏHŠŠÐ:u„ÒtŠAŠÐ:FuƒÁƒÆ„Òuà3ÉëɃÙÿ…Éu Ç„$((ïHƒÿtaGÿƒøw*ÿ$…¤u@¸ïHë!¸ ïHë¸øîHë¸äîHë ¸¼îH븘îH‹L$‹T$P‹„$,Q‹ ”FRPƒÁ@h|îHQ豃ĊD$„Àt Uÿ FƒÄ‹T$Rÿ F‹t$$ƒÄVètƒÄ‰D$…À…eýÿÿ;5”Ft VÿÜFƒÄ_^]3À[ÄËÿwr@r@Ts@Fs@Js@Bs@Ns@Ps@7t@0t@>t@Et@St@St@Lt@S‹\$ V‹t$ W¹3À‹þó«ŠC$„Àt‹C(‰FhLïHèc1‹øƒÄ…ÿt WÿôFW‰Fèz^‹‹ÜƒÄ‰N_^[ÃÇFO‹“܉V_^[ÃV‹t$W‹†À‹¾Ü…ÀuK‹†¼PhôÏHè)ƒÄ…Àt‹ ”FƒÁ ‰ŽÀë"‹–¼h@ÒHRÿÐFƒÄ‰†ÀƆÄ‹†À…Àt‹ø‹D$ƒøwTÿ$…w@‹D$Ph”ïHWèsƒÄ 3À_^ø„ïHë¸tïHë ¸dïHë¸TïHŠŽÅ‹T$Q‹L$RQWPè)ƒÄ_3À^ív@Óv@Åv@Úv@Ìv@QŠD$ÇD$„ÀtÇD$@‹D$S‹\$U‹l$WUUPh¸ïHSèÚƒÄ3ÿ…í†0VWh°ïHSèÀŠD$4ƒÄ „ÀuF‹D$3ö…Àv< >;Ís‹L$ >3ÀŠ Ph¨ïHSèŒƒÄ ëSh¤ïHÿFƒÄ‹D$F;ðrÄ‹D$3ö…À†©>;ÕƒžŠD$(„ÀtD>;Ås‹L$ €<0 u€|0 tb‹T$ ,Š.< r <€s%ÿë¸.Ph ïHSèŠD$4ƒÄ „Àt‹L$$D>;Ás€|. u€|. t‹D$‹l$$F;ð‚qÿÿÿë+t$|7ë‹D$‹l$$+ð|7Sj ÿœF‹L$ƒÄù;ý‚Òþÿÿ^SÿÄFƒÄ_][YÃQ¡ õIVö@tZhÇD$ÿ¤F‹ðƒÄ…öt>‹T$L$QVhjRjÆÿXF…Àv‹D$ V˜PèvÏÿÿƒÄVÿ FƒÄ^YøèvÈ‹„$SUVWPL$hQ3ÛÿðFƒÄ …À„¬‹-˜F…ÛuT$RÿŒFƒÄ‹ØëX‹ûƒÉÿ3Àò®÷ÑI|$‹ÑƒÉÿò®÷ÑID PSÿ¨F‹ØƒÄ…Ûta|$ƒÉÿ3Àò®÷Ñ+ù‹÷‹Ñ‹ûƒÉÿò®‹ÊOÁéó¥‹Êƒáó¤j SÿÕ‹ðƒÄ…öu'‹„$L$PhQÿðFƒÄ …À…aÿÿÿ…ötÆ_^‹Ã][ÄÃQSVW‹|$WÇD$ÿŒF‹ØƒÉÿ3À‰\$ò®÷ÑIQÿ¤F‹ðƒÄ…öu_^ƒÈÿ[YÃUh8ïHSÆÿF‹ØƒÄ…Û„ h8ïHjÿF‹èƒÄ…턆‹þƒÉÿ3Àò®÷ÑItSh8ïHVh0ïHVè ƒÄë=‹D$jh8ïHPÿüFƒÄ …ÀSth°ðHVèàƒÄ ëh8ïHhäÏHVè˃ÄjVÿ¨FƒÄƒøÿuVÿ¬FƒÄƒøÿ‰D$t …í‹Ý…VÿÿÿëtÿøF‹ƒÀóƒøwM3ÉŠˆÀ{@ÿ$¬{@‹”FVƒÂ@h„ðHRë;Vh`ðHë*‹ ”FVƒÁ@h8ðHQë!‹”FVƒÂ@hðïHRëVhÐïH¡”FƒÀ@Pè§ƒÄ V‹5 FÿÖ‹L$QÿÖ‹D$ƒÄ]_^[YÃI7{@c{@Q{@I{@u{@ƒì ‹D$‹L$‹T$‰D$‹D$‰L$RPL$hÀŒ@QÇD$è,‹L$ƒÄ…Ét;L$u ‹T$ÆBÿƒÄ ËL$ÆƒÄ ÃìT‹„$dUV‹´$hWŒ$`P”$dQRVÇD$$u ‹L$F_‹Ã‰1^[Ã_^3À[Ãƒì ‹D$SU‹l$V‰D$ŠW3ÿ3Ʉ҉L$„}Š@€ù%‰D$ …`€8%u @‰D$ éQT$ 3ÛGRP‰|$,è:ÿÿÿ‹ðƒÄ…öu‹÷;t$~‰t$‹D$ 3ÿ‰|$‰|$ŠQèσĄÀ„B‹D$ ¾8ƒï @ƒÿQ‰D$ ‡3ÒŠ—P‹@ÿ$•‹@ƒËéüƒËéô€çþƒËééƒËéኀπ€ù*uE‹|$$ËL$ @GQP‰D$(‰|$,è‘þÿÿƒÄ…Àt‰D$ë ‹T$$‰T$‹Â;D$Ž“éŠL$ j QP€Ï€ÿìFƒÄ ‰D$ëtƒËësöà tƒË@ëiƒË ëd€Ë€ë_öÃu€Ï€Ï T$ j HRPÿìFƒÄ ‰D$ë8‹|$$L$ €Ï@GQP‰|$,èþýÿÿƒÄ…Àt‰D$ë ‹T$$‰T$‹Â;D$~‰D$‹D$ ŠP葃ĄÀ…Âþÿÿ‹|$‹L$ ¾ƒÀ»ƒø3‡23ÒŠÜ‹@ÿ$•¤‹@ƒËDvýDÅÇéLvýDÍÇéTvýDÕÇéõDvýDÅÇéâLvý€ÏDÍÇéÌTvý€ÏDÕÇé¶Dvý€ÏDÅÇé Lvý€ÏDÍÇéŠTvýËDÕÇëtDvýDÅÇëdLvý3ÒDÍÇ‹L$ €9E•ÂJâÊ Úë9Tvý3ÉDÕÇ‹T$ €:G•ÁIáÉ ÙëDvýDÅÇ‹T$H ‰X‰xöÇ@‰t"Oÿ3ö‰H IDÍÇ H ‰p‰p‰1ë3ö÷ÃtBÿ‰@DÕÇ ‰p‰p‰p ‹D$ ‹L$(‹|$$ƒÁP‰L$(‰Qü€8…‡üÿÿ‹L$3ö…É~s‹D$,PøHüE‹|$F;÷}ƒx u ‹yƒÁƒÂ‰x‹xðƒÿ w.ÿ$½Œ@ŠXô‹yƒÁƒÂ‰8ëÝBŠXôƒÁƒÂÝëÇ@ð‹|$ƒÀ;÷|¤‹Ç_^][ƒÄ Ã_^]‹Á[ƒÄ ÃI£‡@¾‡@kˆ@«‡@³‡@Ƈ@Hˆ@Pˆ@Cˆ@§ˆ@/ˆ@4ˆ@9ˆ@§ˆ@      ‹ÿ­‰@؉@àˆ@q‰@‡‰@‰@‰@öˆ@E‰@ ‰@ãˆ@/‰@[‰@Š@       ÒŠ@ÒŠ@ÒŠ@ÏŠ@ÒŠ@öŠ@öŠ@ߊ@öŠ@ïŠ@¾D$ƒÀàƒøQw3ÉŠˆlŒ@ÿ$dŒ@°Ã2ÀËÿ\Œ@_Œ@‹L$‹A‹Q;Âs‹‹D$ˆ‹B‰‹QB‰QÃÈÿËL$ ‹T$D$P‹D$QRPè×îÿÿƒÄÃƒì ‹L$D$PQT$h @RÇD$ÇD$ÇD$èüîÿÿƒÄƒøÿ‹D$u…Àt‹D$Pÿ FƒÄ3ÀƒÄ Ã…Àt‹L$‹T$Æ ‹D$ƒÄ ÃhõIÿŒFƒÄƒÄ ÃV‹t$ ‹…Àu&j ÿ¤FƒÄ‰…ÀuƒÈÿ^ÃÇF ÇFë+‹V‹NB;Ñr ÉQPÿ¨FƒÄ…ÀuƒÈÿ^ËV‰Ñâ‰V‹N‹‹D$ˆ‹NA‰N^Ãƒì ‹D$‹L$PQT$h @RÇD$ÇD$ÇD$èìíÿÿƒÄƒøÿ‹D$u…Àt‹D$Pÿ FƒÄ3ÀƒÄ Ã…Àt‹L$‹T$Æ ‹D$ƒÄ ÃhõIÿŒFƒÄƒÄ ËL$D$ PQT$ hàŽ@Rèwíÿÿ‹L$ƒÄÆËL$‹D$‹ˆ‹B‰ËL$‹œFD$P¡”FQƒÀ RPè!íÿÿƒÄËL$‹œFD$ P‹D$QRPèõìÿÿƒÄËD$ ‹L$‹œFP‹D$QRPèÕìÿÿƒÄáõIS…Àu3‹\$öÃtèH.öÃtè.…Àt¸[ÃÇõI‰õI3À[ÃìD$Pjÿ,F…Àu f‹D$<u3ÉŠÌ„Éu 3ÀÄÃÿ F¸ÄáõI…Àt5èâ@öõItèÄ-öõItèÇõIÇõIÃÿ% FQ¡õI…Àu jèÿþÿÿƒÄD$Pè‚H‹L$÷ØÀ÷Ð#ÁƒÄËL$ ‹D$‹T$QPRèÜIƒÄ ÃV‹t$‹F…Àt‹H…ÉuMІpW„Àt‹>è@;øt…ÿt WèM¡ƒÄè@‰‹_…ÀuhÔ@j耞ƒÄ‰…Àu¸^ÃVèJšƒÄ^ÃV‹t$‹F…Àt‹H…ÉuІp„Àu ‹Pèë ƒÄVèbFƒÄ^ËD$ ‹L$‹T$PQRè|¡ƒÄ ËD$‹L$PQÿ¤FƒÄ÷ØÀ@ËD$ ‹L$‹T$PQRÿœFƒÄ ÷ØÀ@ÃVWjÿ¤F‹ðƒÄ…öt9‹D$ÇFPÿŒFƒÄ‰…Àt‹|$ …ÿtWè$ƒÄ‰p‹Ç_^ËÆ_^Ã_3À^ËD$…ÀuËH…Ét ‹Á‹H…Éu÷ÃV‹t$…öt%S‹ FW‹‹~…ÀtPÿÓƒÄVÿӃċ÷…ÿuå_[^ÃìV‹´$ …ötJІh„Àt@‹Œ$„$WPQT$hRè4éÿÿ|$ƒÉÿ3Àò®÷ÑID$QPjVèhƒÄ _^ÄÃU‹l$V‹E…Àt|ŠÌ‚„Éur‹T$L$QRhPèÔèÿÿŠ…hƒÄ„ÀÆ…Ì‚tI‹USW‹úƒÉÿ3Àò®÷ÑI2Û‹ñþÿ}Æ2 ‹EF³Æ‹MVQjUèØƒÄ„Û_[t‹UÆDÿ^]Ãì‹T$U‹l$L$QR‹E‰D$ è’úÿÿ‹ÐƒÄ…Ò‰T$u ¸]ƒÄÃSVW‹úƒÉÿ3ÀÇD$ ò®÷ÑID$ ‹ñ‹L$PVRQU‹úèn‹ØƒÄ…ÛuF‹D$Šˆh„Ét‹T$ RWjPè9ƒÄ‹D$ ;Æt‹L$+ðøD$ PVWQUè(‹ØƒÄ…Ûtº‹T$Rÿ FƒÄ‹Ã_^[]ƒÄÃìxV‹´$€Š†¼„À„Ä‹„$Œ‹Œ$ˆ‹–ÄPQRè»ÅƒÄ …À™P‹†ÄPèóÏHÿƒÄƒùwfÿ$l•@‹Œ$3À^ǃÄxÃèh°‹Ph ñHRèþÿÿƒÄ ¸7^ƒÄxÃè¨DL$QPèI‹PhñHRèïýÿÿƒÄ¸7^ƒÄxÃP‹hèðHPèÔýÿÿƒÄ ¸7^ƒÄxËðë5‹Œ$Œ‹”$ˆ‹„$„jQRPÿèF‹ðƒþÿuèׯ=3'u3ö‹Œ$‹Æ@÷ØÀ‰1$É^ƒÀ7ƒÄxÃÓ”@Ÿ”@Ÿ”@þ”@³”@SU‹l$VW‹|$ …ÿu‹ýƒÉÿ3Àò®÷ÑI‹ùŠ\$‹t$öÃt*‹FPWjUÿVlƒÄ;ÇthdñHVèýÿÿƒÄ¸_^][ÃöÃt>‹Fp…Àu‹N$…Ét0…Àu‹Fl‹N$QWjUÿЃÄ;ÇthLñHVèÕüÿÿƒÄ¸_^][Ã_^]3À[ÃìxS‹œ$VW‹¼$ˆÇЇ¼„Àt}‹„$”‹Œ$‹—ÄPQRè ËðƒÄ …ö‘‹‡ÄVPè΃ăøwÿ$… —@èòB‹ðè‹®L$ PQVè_G‹ƒÄPhxñHRè.üÿÿƒÄ¸8_^[ƒÄxË„$”‹Œ$‹”$ŒjPQRÿäF‹ðƒþÿuè3®=3'u _^ƒÈÿ[ƒÄxÉ3_^3À[ƒÄxÃIþ–@‰–@ô–@ô–@‰–@‰–@þ–@V‹t$‹F|…Àt‹N ‹T$Q‹L$R‹T$QRVÿЃÄ^ËD$ …À|4ƒø/‹N‹… FW‹=ÈFQjjRÿ׋F‹L$(‹T$$PjQRÿ×ƒÄ _3À^ËL$‹T$D$ PQRè ƒÄ ÃƒìSUV3íj,‰l$‰l$‰l$2Ûÿ¤F‹ðƒÄ;õ‰t$„ÜW¹ 3À‹þó«‹|$,º‹D$…À…–„Ût‹L$‹‹iƒÁƒø‰L$u2Ûë׋ƒÇƒø„<Hƒø‡%ÿ$…Øœ@„Ût ÇD$몋ƒÇ…À‰D$t³뙉T$ë“‹F ‰Fƒ>t ÇD$éyÿÿÿ„Ût‹Å닃DžÀtωéaÿÿÿ‹F…Àt ÇD$éMÿÿÿ„Ût ‹Å‰Fé?ÿÿÿ‹ƒÇ‰Fé2ÿÿÿ‹F ‰F‹F…Àt ÇD$éÿÿÿ„Ût‹Å닃DžÀ„hÿÿÿ‰Féùþÿÿ‹F …Àt ÇD$éåþÿÿ„Ût ‹Å‰F é×þÿÿ‹ƒÇ‰F éÊþÿÿ‹F…Àt ÇD$é¶þÿÿ„Ût‹Å닃DžÀ„ÿÿÿPÿŒF‰F‹FƒÄ ‰Fé‚þÿÿ„Ût‹Å닃NjN…Ét%öF„ãþÿÿ…À„ÈþÿÿVjPÿŒFƒÄPé…ÀtPÿŒF‰F‹FƒÄ º‰Fé+þÿÿ‹F‰T$ ‰Féþÿÿ„Ût‹Å닃NjN…ÉtöFë‘…ÀtPÿŒF‰F‹FƒÄ º‰FéÝýÿÿ‹F‰T$ ‰FéÌýÿÿ‹N‹FƒÉ …À‰Nt ÇD$é¯ýÿÿ„Ût‹Å닃DžÀ„þÿÿ‰Fé’ýÿÿ‹F…Àt ÇD$é~ýÿÿ„Ût ‹Å‰Fépýÿÿ‹ƒÇ‰Fécýÿÿ„Ût‹Å닃NjN…Ét?öF„¿ýÿÿ…À„¤ýÿÿVPÿŒFƒÄPjèö‹ðƒÄ …ö…ýÿÿÇD$é ýÿÿ…À„oýÿÿPÿŒFƒÄ‰Féñüÿÿ„Ût‹Å닃NjN$…Ét ÇD$éÕüÿÿ‰F$éÍüÿÿ„Ût‹Å닃NjN …Ét ÇD$é¬üÿÿPÿŒFƒÄ‰F é•üÿÿÇD$éüÿÿ‹t$‹l$(‹\$$3ÿƒ>t‹F…Àu…ÿ„‹F …Àt öF…ô‹F‹Èƒát¨…â‹V…Òu ¨t¨ …Ϩt¨…Ã…Éu¨t"‹F…Àu‹D$‹NPQè8PÿŒFƒÄ ‰FöFu;t$u‹VRV赃ąÀuröF+u‹F NPQ蛃ąÀuX‹V ‹F$‹NUSWR‹VP‹FQ‹NR‹V P‹FQ‹NR‹PQR赋øƒÄ4…ÿuÇD$‹F…Àt‰D$‹v(…ö…óþÿÿëÇD$ëÇD$‹t$‹= F‹Æ‹v(Pÿ׃Ä…öuñ‹D$_^][ƒÄÃ^]¸[ƒÄÃy˜@q˜@£˜@Ú˜@Ò˜@ ™@:™@L˜@j›@}™@ê™@8š@rš@¡š@›@7›@j0ÿ¤F‹ÐƒÄ…Ò„W¹ 3À‹úó«‹|$…ÿ‰zt‹L$ …Éu ƒÉÿò®÷ÑIë3É‹D$‰J‹L$‰B ‹D$‰J‹L$‰B‹D$ ‰J‹L$(‰B‹D$,‰J ‹L$$‰B,‹D$0‰J(…À_t ‹H$‰J$‰P$‹ÂËL$4‹…Àu‹D$0‰‰‹ÂÃ3ÀÃj,ÿ¤F‹ÐƒÄ…Òt>W¹ 3À‹úó«‹D$_…Àt‰B‹D$…Àt‰B‹D$ ÇB…Àt ‹H(‰J(‰P(‹ÂÃ3ÀÃQ‹D$ …À‰D$uÇD$òHS‹\$ UVWÇD$¾¸ñH‹ƒÉÿ‹ú3Àò®÷ÑI‹û‹éƒÉÿò®÷ÑI;Ír(‹úƒÉÿò®÷ÑRI‹Ó‹û+уÉÿò®÷ÑIÑRèçòÿÿƒÄ…Àu‹T$ƒÆBþàñH‰T$r¦‹D$_^][YËD$_^]‹żñH[YËD$S‹\$ U3íV‹0W…Ûu‹þƒÉÿ3À½ò®÷ÑI‹Ù +Qÿ¤F‹T$ƒÄ…À‰u _^]¸[Ëˋø‹ÁÁéó¥‹Èƒá…íó¤t ‹L$‹Æ_^]3À[ÃSj)ÿ¤F‹ØƒÄ…Ûu[ÃVWjÿÌF‹ õIÁAP‰ õIÿ F¹¾LòH‹û3À󥤋ûƒÉÿƒÄò®÷ÑI‹ñƒþ(}#‹=Fÿ×%€yHƒÈð@Š€àñHˆFƒþ(|ã_ÆC(‹Ã^[ÃS‹ FV‹t$ W‹F‹>PÿÓVÿӃċ÷…ÿuì_^[ÃV‹t$…öthUW‹= F‹F$‹.…Àt PèàÿÿÿƒÄöF(u ‹F…ÀtPÿ׃ÄöF(u ‹F …ÀtPÿ׃Ä‹F…ÀtPÿ׃Ä‹F,…ÀtPÿ׃ÄVÿ׃Ä‹õ…íu¢_]^Ãì‹„$S‹œ$UVW3ÿ;߉|$‰|$‰8u _^]3À[ÄÃè†þÿÿ‹ðL$VhXóHQ‰t$ è@‹T$ƒÄ ‰T$…ÿtD$hTóHPè"ƒÄøVL$hLóHQè jT$ h$óHRøèz‹Kø‹CT$(PQRèføjD$8h óHPèSø‹C$ƒÄ0…ÀtèòýÿÿPL$hðòHQ‰D$$è®ƒÄ ø‹ë‹C$…Àt$‹E,…Àu‹E ‹T$PRD$h¸òHPèƒÄë#öC(t‹C,…Àu‹C PL$h¨òHQè\ƒÄ ø‹E…ÀtPT$h”òHRè@ƒÄ ø‹u …öt‹L$PhŒòHQè"‹vƒÄ ø…öuâjT$h„òHRè…ø‹C(ƒÄ ¨u)¨t ‹C‹KPë‹C‹K PT$QRèZƒÄ øé‘‹E PhôÏHè2ïÿÿƒÄ…Àt‹5”Fë‹M hØÏHQÿÐFƒÄ‹ð…ö„×VhT$(jRÿÔFƒÄ…Àt,PD$$L$PQèíVhT$4jRøÿÔFƒÄ…ÀuÔ;5”Ft VÿÜFƒÄ‹m$…í…þÿÿ‹C$…Àt ‹t$D$VhxòHPèVøÿ FƒÄ‹‹t$…Û…ÊýÿÿVL$hlòHQèï‹”$8ÇV‰ÿ F‹Œ$4‹D$,ƒÄ‰3À_^][ÄËT$Rèvüÿÿ‹D$Pÿ F‹Œ$,ƒÄ¸_^]Ç[ÄÃSUV‹5¤FWj ÿÖ‹\$ ‹èƒÄ…ÛÇEu‹|$ƒÉÿ3Àò®÷ÑI‹ÙCPÿÖ‹t$‹Ë‹Ñ‹øÁé‰EƒÄó¥‹Êƒáó¤‹E‹L$‰]Æ‹…Àt‰(_‰)^‹Ã][øè†‹Œ$„$ PT$QRÿF‹Œ$D$ jPQèGÿÿÿÄËL$…Éu¸ËD$‰Ç@3ÀËT$S‹\$ U‹ ¯\$3ÀV…ÉWu_^][ËI‹z+Ï;ËI‹2‹z‹N‹v+Ï÷‹|$‹éøÁéó¥‹Íƒáó¤‹ ‹j‹qÇB‹ +õƉ …Ét;‹y‹ó+ð;þ~·‹2‹z‹Ë‹v+È÷‹|$‹éøÁéó¥‹Íƒáó¤‹Ë+È‹BÁ‰B‹Ã_^][ËT$S‹\$ U‹¯\$VW…Àu_^]ƒÈÿ[Ë@‹r+Æ;Ã=‹2‹z‹F‹v+Ç÷‹|$‹È‹éÁéó¥‹Íƒáó¤‹ ÇB…À‹ ‰ u1…Ét-9Y~Ë‹|$‹Ë‹p‹Bð‹ÁÁéó¥‹Èƒáó¤‹BÉB‹Ã_^][ÃQ‹L$ SUV…ÉWu‹|$ƒÉÿ3Àò®÷ÑIqVÿ¤Fnÿ‹øƒÄ3Û‹ÅM…À‹Îty‹T$Š‹Wô‰V(‹Gü‰F,ÇF4‹‰N<é!‹Wô‰V(‹Gü‰F,ë.‹Wì‰V(‹Gô‰F,‹Oü‰N4‹‰V<é÷‹Gì‰F(‹Oô‰N,‹Wü‰V4‹NÇF<A¸…ëQ‰N‹…É}1÷éÁú‹ÂÁèÐR€‹ÁÁâ÷؋ڹd™÷ù+Ó‹\$‰V é›÷éÁú‹ÂÁèÐR€‹ÁÁâ‹Ú¹d™÷ù÷Ú+Ó‹\$‰V éj‹‰V é`‹ƒè<‰F éS‹Oüƒé<‰N éEÇF‹‰Vé4ÇF‹Gü‰Fé"‹Oü‰N‹‰Vé‹Gø‰F0‹‰N$é‹Gð=è|‰F8‹Wø‰V0‹‰F$éå‰F0‹Oø‰N$‹‰V8éÒ‹Gø‰F8‹Oü÷Ù‰N0‹÷Ú‰V$鸋Gø‰F$‹Oü‰N0‹÷Ú‰V8é ‹Gü‰F0‹‰N$é‹Wô‰V0‹Gø‰F$‹‰N8éz‹‰V0‹Gü‰F$éj‹Oü‰N0‹Wø‰V$‹‰F8éT‹NP‹VH‹FD÷Ù÷Ú÷؉NP‹N@‰VH‹VL‰FD‹FT÷Ù÷Ú÷؉N@‰VL‰FTé‹Oü‹FT¯Á‰FTé ‹Wü‹FT¯‰FTéù‹‹NTȉNTéê‹Oü‹FL¯Á‰FLé׋Wü‹FL¯‰FLéÄ‹‹NLȉNL鵋Oü‹F@¯Á‰F@颋Wü‹F@¯‰F@é‹‹N@ȉN@逋Oü‹FD¯Á‰FDém‹Wü‹FD¯‰FDéZ‹‹NDȉNDéK‹Oü‹FH¯Á‰FHé8‹Wü‹FH¯‰FHé%‹‹NHȉNHé‹Oü‹FP¯Á‰FPé‹Wü‹FP¯‰FPéð‹‹NPȉNPéá‹F…Àt‹N …Ét‹N…Éu ‹‰N8éÂ?'~P‹V ¹dB‹\$‰V ‹™÷ù¸…ëQ‰V$‹÷é‹Â¹dÁø‹ÐÁê™÷ù¸­‹Ûh‰V0‹÷éÁú ‹ÂÁèЉV8ëj@‰F‹ƒùd}‰N(ÇF,ÇF4ÇF<ëE¸…ëQ‹\$÷éÁú‹ÊÁéѹd‰V(‹™÷ùÇF4ÇF<‰V,ëÇD$4닉T$4‹Å ­º÷Ø+Ñ‹L$(C‹D$4ú‰¿MtõHf‹ ¿U$÷H¿éÅx ƒø3f9 EÌ÷Hu¿Ed÷H‰D$é|øÿÿ¿U”öH‰D$ékøÿÿh4Ièm‹D$4ƒÄ…Àt‹T$‹5 FRÿÖ‹D$$PÿÖƒÄ_^]¸[ÄàËD$0…Àt‹L$‹5 FQÿÖ‹T$$RÿÖƒÄ_^]3À[ÄàËD$0…Àt‹D$‹5 FPÿÖ‹L$$QÿÖƒÄ_^]¸[Äàûª@׫@ß«@ç«@ï«@M°@÷«@¬@,¬@:¬@V¬@ã¬@í¬@ú¬@­@­@+­@;­@K­@{­@•­@­­@½­@Ó­@ã­@ù­@M°@.®@A®@T®@c®@v®@‰®@˜®@«®@¾®@Í®@à®@ó®@¯@¯@(¯@7¯@J¯@]¯@l¯@=°@G°@‹T$ ‹D$…Ò~‹L$V+È2Šˆ@Nu÷^Ã3ÀÃìSU‹-´FV‹t$(W¡¸Fƒ8~‹3ÒjŠRÿÕƒÄë‹‹°F3ÉŠ‹ŠHƒà…ÀtÿëÊ‹Šˆ\$,‹D$,%ÿPЃú vh€û-tq€û+t^‹ ¸Fƒ9~ hPÿÕƒÄë‹°F‹ f‹A%…Àua€û(…Ú3Ò‹Š@„ɉ„Ù€ù(uBë€ù)uJ…ÒßéIÿÿÿ€û-t €û+…¾€ë-öÛÛƒãKA‰¾ƒê0ƒú †£éÿÿÿ|$‹Š@‰¡¸Fˆ\$,ƒ8~‹L$,háÿQÿÕƒÄë¡°F‹T$,âÿ‹f‹Q%…Àu€û.u T$#;ús©ˆG뤋L$(Æ‹>D$OPQ‰>衃Ä_^][ƒÄË_¾A‰^][ƒÄÃ_^]3À[ƒÄÃ3Û‹|$(Ç‹ŠˆD$,‹L$,áÿB‰AЃø w(‹’DQЉ‹Š ˆL$,‹L$,áÿB‰AЃø vØJ…Û‰}‹÷Ù‰‹Ã_÷ØÀ^][ƒÄÃS‹\$ U‹-´FŠV„ÀW‹ótF‹=F¡¸Fƒ8~3ÉjŠQÿÕƒÄë¡°F3ÒŠ‹ŠQƒà…Àt ¾Rÿ׃ĈŠFF„ÀuÀ¾pI‹ÃŠŠÊ:u„ÉtŠPŠÊ:VuƒÀƒÆ„Éuà3ÀëÀƒØÿ…À„!¾hI‹ÃŠŠÊ:u„ÉtŠPŠÊ:VuƒÀƒÆ„Éuà3ÀëÀƒØÿ…À„é¾dI‹ÃŠŠÊ:u„ÉtŠPŠÊ:VuƒÀƒÆ„Éuà3ÀëÀƒØÿ…À„¾\I‹ÃŠŠÊ:u„ÉtŠPŠÊ:VuƒÀƒÆ„Éuà3ÀëÀƒØÿ…À„e‹ûƒÉÿ3Àò®÷ÑIƒùu½ë$‹ûƒÉÿ3Àò®÷ÑIƒùu€{.u ½ÆCë3í¡8øH¿8øH…Àth‹üF…ít‹‹L$jPQÿÓƒÄ …À„éë7‹7‹D$ŠŠÊ:u„ÉtŠPŠÊ:VuƒÀƒÆ„Éuà3ÀëÀƒØÿ…À„~‹G ƒÇ …Àu¢‹\$‹5àúH¿àúH…öt=‹ÃŠŠÊ:u„ÉtŠPŠÊ:VuƒÀƒÆ„Éuà3ÀëÀƒØÿ…À„`‹w ƒÇ …öuþXI‹ÃŠŠÊ:u„ÉtŠPŠÊ:VuƒÀƒÆ„Éuà3ÀëÀƒØÿ…Àu _^]¸[Ë5hùH¿hùH…öt=‹ÃŠŠÊ:u„ÉtŠPŠÊ:VuƒÀƒÆ„Éuà3ÀëÀƒØÿ…À„Ö‹w ƒÇ …öuËûƒÉÿ3Àò®÷ÑI‹éM€<+suPÆ+‹5hùH…ö¿hùHt9‹ÃŠŠÑ:u„ÒtŠHŠÑ:NuƒÀƒÆ„Òuà3ÀëÀƒØÿ…ÀtC‹w ƒÇ …öuÇÆ+s‹5ðùH¿ðùH…ötN‹ÃŠŠÊ:u-„ÉtŠPŠÊ:VuƒÀƒÆ„Éuà3Àë‹D$‹W‰‹G_^][ÃÀƒØÿ…À„‹w ƒÇ …öu²ŠC„À……‹¸Fƒ:~3ÀhŠPÿ´FƒÄë‹°F3ÉŠ ‹f‹H%…ÀtL‹5HýH¿HýH…öt=‹ÃŠŠÊ:u„ÉtŠPŠÊ:VuƒÀƒÆ„Éuà3ÀëÀƒØÿ…À„„‹w ƒÇ …öuÊ 3ö„ɋËÓtŠ€ù.tˆ BëFŠH@„Éuë…öÆtH‹5àúH¿àúH…öt9‹ÃŠŠÊ:u„ÉtŠPŠÊ:VuƒÀƒÆ„Éuà3ÀëÀƒØÿ…Àt‹w ƒÇ …öuÇ_^]¸[ËL$‹G‰‹G_^][ËT$_^]Ǹ[ËD$_^]Ǹ[Ã줋„$¨SU‰D$ ‹„$´3íV;ÅWt‹‰L$ëUÿÌFƒÄ‰D$T$Rÿ FƒÄ;ń̋HÁl‰L$L‹PB‰T$D‹H ‰L$8‹P‰T$<‹H‰L$@‹‰T$H‹@ L$‰„$ŒQÇD$T‰l$h‰l$`‰l$\‰l$X‰l$d‰l$l‰l$$‰l$(‰l$,‰l$0‰l$4èêîÿÿƒÄ…À…I‹L$,¸;È89D$0.9D$ $9D$$‹T$LRèv‹L$lƒÄ””øÿÿ‹D$D‹L$`‰”$€Tÿ‹D$8‹L$T‰T$|ȉL$x‹L$,;Íu9l$(t 9l$ u9l$$t3ö3Ò3Àë&‹T$P‹D$tF;õ|òëÆ>;õuÆD/ÿ‹Ç_^][á4öI…ÀuÇ4öIè8«éªá4öI…ÀtèÒè­$Ç4öIÃV‹t$І¼„ÀtcjèJ ‹†ÄƒÄ…Àt+Pègœ‹†ÄPè+§‹ŽÄQè?—ƒÄ džÄ‹†À…ÀtPè’£ƒÄdžÀƆ¼^ÃS‹\$UV‹ƒÀ‚…Àt^]3À[Ël$‹õÁæVÿ¤F‹ÐƒÄ…Òu ^]¸[ËÎW3À‹úÁéó«‹Îƒáóª_‰«(^‰“À‚ǃĂ]3À[ÃV‹t$‹†À‚…ÀtG‹†(W3ÿ…À~%S3Û‹–À‚‹ÃÂPè1‹†(ƒÄGƒÃ@;ø|ß[‹ŽÀ‚Qÿ FƒÄ3À_^Ã3À^ÃV‹t$‹F…Àt3PèþµFÇFPÇFè·L‹Qÿ FƒÄ Ç3À^ø^Ãì”SU‹¬$ V3ö3ÛÆ…¼ 8öIW‹}„À‰\$‰t$t9·u9· tWèÊƒÄÆ8öI‹‡HtHtHtè¼ëè5áë ènÉëègÈPèÁžƒÄ;Ɖ…Àuh\IWè™ÒÿÿƒÄ¸_^][Ä”ÃVhÿj P舚‹‡´ƒÄ;Æt3‹À‹—¼Q‹¸RQPUèσąÀu_^]¸:[Ä”ˇ$;Æt2‹•ÀPR衜ƒÄ…Àuh@IWèÒÿÿƒÄ¸;_^][Ä”ˇ;Æu 9·„ã‹‹•ÀQPR袦ƒÄ …Àu~9· t>‹‡;Æu¸8I‹;Îu¹8IPQhðIWè˜ÑÿÿƒÄ¸<_^][Ä”Ãh°IWè Ñÿÿ‹‡ƒÄ;Æu¸8IPh IWèìÐÿÿ‹‡ƒÄ ;Æu=ë6hpIWèÒÐÿÿ‹‡ƒÄ;Æu¸8IPh IWè´Ðÿÿ‹‡ƒÄ ;Æu¸8IPh`IWè–ÐÿÿƒÄ ‹— ‹À3À;Ö•Àh0Ê@PQè¡‹‡,ƒÄ ;Æt9‹—0‹ÀRQWÿÐ‹ØƒÄ ;Þ‰\$th<IWè®ÐÿÿƒÄ‹Ã_^][Ĕ˕ÀRèRP‰…Ä裊…ýƒÄ„À‰µÈu1D$PUèøƒÄ…Àu‹L$‹•ÄQRè ³h IWèÕÏÿÿƒÄ‹…°‹ÄPQ蟔ƒÄ‹‡Œ…Àu‹‡…Àu¾à“ëV‹—‹‡RPèn‰RP臉‰D$(‹‡ŒÛD$(ƒÄ…Àt;‡‹‡€€4€Áæèu~+ðˆ3‹Ä3ÀQ‰D$(‰„$,è‚•ƒÄƒø„Š‹•ÄPRè)¡ƒÄƒøuQ‹”$(3À…Òv‹°Œ$,9t@ƒÁ;Ârô‹\$;Âulƒú@sg‹°‰Œ„,‹„$(@‰„$(ëIƒø…½‹T$$3À…Òv‹°L$(9t@ƒÁ;Ârô‹\$;Âuƒú@s‹•°‰T„(‹D$$@‰D$$¸ÓMb÷îÁú‹ÂÁèЉT$’€ €Áá+ñL$$¶€€D$ÁâP‹…°‰T$$j”$0Q@RPÿàF…À^þÿÿu|hIWè}ÎÿÿƒÄ¸_^][Ä”Ãè=†àt4=† t-Œ$,QPèiPhIWè=ÎÿÿƒÄ¸#_^][Ä”ÃhÈIWèÎÿÿƒÄ¸<_^][Ĕ˕ÄRè°¡Pè*ÃPh¬IWè~Íÿÿ‹D$(ƒÄ…Àu UèƒÄ‹…ÄPèþ’ƒÄ‰…È…ÀuhˆIWè¶ÍÿÿƒÄ¸3_^][Ä”ÃhpIWè(Íÿÿ‹ÈƒÄjjQèŃÄPè<)‹ðƒÄ …öu*hPIWèhÍÿÿ‹•ÈRèŒ(ƒÄ ¸#_^][Ä”ÃVh@IWèÍÌÿÿVè÷&‹…È‹‹Q‹Ph0IUè.‹È‹‹B‹HQh IU苇ƒÄ(…ÀtUèq‹ØƒÄ…Û… ‹…ÈjjPèƒÄPè‹(‹ðƒÄ …öuhüIWè·ÌÿÿƒÄ»#ëiVhìIWè1ÌÿÿVè[&‹ÄQ衃ĉ‡…Àt0‹ P…ÉthÈIWèlÌÿÿƒÄ »3ëhIWèçËÿÿƒÄ ëhtIWè×ËÿÿƒÄ‹•ÈRèh'ƒÄ‹Ã_^][Ä”ÃS‹\$VW‹ƒ»¬…Àth@Pè+‹ðVèfƒÄ „ÀuLèú2h@W¾dÆè÷+ŠƒÄ„Àth@WèÓ*‹ðƒÆdVè(ƒÄ „Àuh|ISè6ËÿÿƒÄ‹Æ_^[Ãè6…À•ÀÃS‹\$ UV‹t$W…Û‹.‰l$„Ç‹…Ä…Àt!P‹†ÀPèo›‹ŽÀhPÉ@QèN›ƒÄ‹|$Wè!ƒÄHt_Ht0ƒè(tWhÔIUèËÿÿƒÄ 3À_^][Ãh¤IUèËÿÿƒÄ3À_^][Ë–ÀjSRèI ƒÄ ƒøt?hpIUèÖÊÿÿƒÄ3À_^][ˆÀSPèÿ ƒÄƒøthpIUè¬ÊÿÿƒÄ3À_^][Ël$$U舋ȃÄIt:ItCƒé(t‹L$hDIQèyÊÿÿƒÄ3À_^][ËT$hIRè`ÊÿÿƒÄ3À_^][Ë|$ …ÿu‹ûë‹|$ P‹†ÀWPè8 ƒÄ ƒøt&…í‹Åu¸I‹L$PWhàIQèÊÿÿƒÄ3À_^][Ë–ÀR辉‹øWèfƒÄ…ÀtPèyW‹ØèqPSè 5SèÔ8ƒÄWè{Œ‹†ÀPè/ƒÄ…Àu‹L$h¨IQè©ÉÿÿƒÄ3À_^][Ã_^]¸[ËD$ W…Àt!‹D$‹ ”FPƒÁ@hIQÿ,FƒÄ 3À_ËT$ƒÉÿ‹ú3Àò®‹D$ ÷ÑI;Á~ä‹úƒÉÿ3ÀVò®‹D$ ÷Ñ+ù‹Ñ‹÷‹øÁéó¥‹Êƒá󤋸ƒÉÿ3À^ò®÷ÑI_‹ÁÃV‹t$…ötH€>tChIVè—ÇÿÿƒÄ…Àu1h IVè…ÇÿÿƒÄ…Àt¸^ÃhIVèlÇÿÿƒÄ÷ØÀ^ƒà+Hø^ËD$ìPèàCƒÄL$hQPè̓ÄPèD$‹„$Ä ËD$SUVW‹83틇(…À~a3Û‹·À‚ó‹F…ÀtB‹T$‹Q‹‚dPèÖÆÿÿƒÄ…Àt(‹L$f‹‘tf;V uFÁÌPQèî?ƒÄ„Àu"‹‡(EƒÃ@;è|¡‹L$_^]Ǹ[ˇĂ@‰‡Ä‚‹V‹ø‹D$‰~_^‰]3À[ÃQSU‹l$VW‹}‹ÄQ‹·À‚‹F‰D$è닟(¹ƒÄ;Ù‰D$~'‹‡À‚ƒÀ@‹P…Òt‹P;T$}‰T$‹ðAƒÀ@;Ë|â;Ëu VèÔóÿÿƒÄë ‹‡À‚ÁáÈ‹ñ‹T$‰V‹‡Ä‚‰F‹dQÿŒF‰f‹•tf‰V ƒÆÅÌVUè¸?ƒÄ 3À_^][YÃì‹D$ 3ÒSU‹‰T$‰T$ ‰D$Šˆh„Éu]3À[ƒÄËD$‹‹@ƒù } ]¸[ƒÄÀ|ÿZuÇD$Š €ù9®€ù0Œ¥Bƒú |å¾¾P ‰¬Jðýÿÿƒý2}ƒÅd¾H¾P ‰œJðýÿÿƒû ºƒûŒ±¾H¾P ‰V¾p”JðýÿÿW¾H¾x ‰´Nðýÿÿ¾H ‰¼OðýÿÿŠH €ù0|-€ù9(Š@ <0|!<9¾É¾À ‰ŒHðýÿÿë]¸[ƒÄËL$‹D$…À¸4Iu¸õIPQ‹L$(WVR‹T$0ÅlSUQhIRè1ÅÿÿƒÄ(3À_^][ƒÄÃ]¸[ƒÄÃì,SU‹¬$8VD$(W‹l‹}»PQSÆD$‰|$ è,ƒÄ …Àt »ÇD$$‹•ÈjjjURèöU‹ðƒÄ…ö‰t$ „8ƒûu>‹•lƒÉÿ‹ú3Àò®÷ÑIj.R‰L$<ÿ˜FƒÄ‰D$(…Àt‹øƒÉÿ3Àò®÷ÑI‰L$‹|$Vè¼TƒÄ3É…À‰D$0‰L$ޏŠD$„À…¬QVè¤T‹øƒÄ9u‹GPè’‡‹O‹ðQèWO‹ø‹ÃƒÄƒètƒèuZ;|$$uT‹Ï|$,3Òó¦uHëA‹D$4;ÇuP‹…lVPè ÃÿÿƒÄ …Àu$€>*u$‹D$O;Çu‹T$(‹ÈFQVRèèÂÿÿƒÄ …ÀtÆD$‹L$‹D$0‹t$ ‹|$A;ȉL$ŒHÿÿÿVèIHŠD$ƒÄ„Àt‹…lPh,Iéô‹•ÈL$8hQj RèƒÄPè,EƒÄ…À}Nƒ¿~*hôIWè¡Ãÿÿ‹…ÈPèÅƒÄ ¸3_^][Ä,ÃhÌIWèÃÿÿƒÄ3À_^][Ä,ËlT$8QR膃Ä…Àu\‹‡L$8ƒø‹…lPQ~*h„IWè-Ãÿÿ‹•ÈRèQƒÄ¸3_^][Ä,ÃhXIWè“ÂÿÿƒÄ3À_^][Ä,ÃT$8Rh8IWèsÂÿÿƒÄ 3À_^][Ä,ÃSUV‹t$…öW„™‹þƒÉÿ3Àò®÷ÑIƒù‚„‹\$…Ût|‹ûƒÉÿò®÷ÑItpSVè0ÁÿÿƒÄ…Àt _^]¸[Ê~<*uO€?.uJ‹-˜FGj.PÿՃąÀt5WSÿäF‹ðƒÄ…öt$WVèäÀÿÿƒÄ…Àtj.SÿÕƒÄ3É;ð_^”Á]‹Á[Ã_^]3À[áPöI…ÀuhÔ@jh@öIèÖ]ƒÄ ÇPöIø@öIáPöI…Àth@öIèm`ƒÄÇPöIÃì‹D$S‹\$U‹l$VWƒÉÿ‹uÇ‹û3À‰L$‹T$$ò®÷ÑIÇD$‰L$L$QRSè‹øƒÄ …ÿu _^]ƒÈÿ[ƒÄËF…Àt jjVè|ƒÄ ‹D$‹@PWQèq_‰D$‹FƒÄ …Àt jVè|ƒÄWÿ F‹D$ƒÄ…À…Œ‹D$$T$ RPSUèÑ‹øƒÄ…ÿu'‹D$ …ÀtjL$QU襋D$ƒÄ3Ò…À”‰T$ëK‹F…Àt jjVèp{ƒÄ ‹D$$PSWVèЉD$ ‹FƒÄ…Àt jVèŠ{ƒÄ‹D$…Àu WèƒÄ‹L$(‹T$‹D$_^]‰[ƒÄÃS‹\$ VWSèc‹t$@‹>ø‹Ç‰>@Pÿ¤F‹øƒÄ…ÿu_^[ËD$SPhLIWèð»ÿÿ‹ƒÄ;ÁtWÇÿ FƒÄ3À_^[ËÇ_^[ËT$3ɸgfffA÷êÁú‹ÂÁèЃú}é‹ÁËT$ SUVW‹úƒÉÿ3Àò®÷ÑID$‰L$‹L$ PQRèHÿÿÿ‹øƒÄ …ÿtPj ÿ¤FƒÄ…Àu‹T$Rë+‹l$‹\$Ç@‰(‹ P‹D$ @PWQèH\‹ðƒÄ…öuUèùWÿ FƒÄ_^]3À[ÃT$ RÿÌF‹N‹D$$A‰F‰N‹L$$‹“8‹QRPèWÿ FƒÄ‹Æ_^][Ãì‹D$‹L$‰D$‹D$ T$hÔ@RP‰L$è¹]ƒÄËD$‹L$V‹P‹q+Ö‹0;Ö^| ‹A…Àu¸Ã3ÀÃV‹t$‹F…Àt jjVèJyƒÄ ‹D$ ‹HI‰H‹F…Àt jVèmyƒÄ^ËD$Pÿ FYÃV‹t$‹PèãÿÿÿVÿ FƒÄ^ËD$ǸËD$‹L$S‹\$ U‹(VWSÇÿÔF‹ðƒþÿtahœÿ¤FƒÄ…Àu_^][ÃPH‰P h€‰1‹P ‹ø‰ ‹H ÇAHQVfÇ@fÇ@ ‰ÿØFPè#ƒÄ ‹Ç_^][ÃSÿÜF‹ø…ÿuShTIUè½ÿÿƒÄ ‹Ç_^][Ãh(#ÿ¤FT$WR‰D$ è ƒÄ ‹ø_^][ÃQ‹D$‹L$ SUV‹0‹ÞƒÆW3À‰3‹‹úƒÉÿò®÷ÑI‹ùGWRVÿ0F÷‹L$(‹Ö¸ƒâƒÄ +Â3íð‰s‹A…Àt‹Ðƒ:tEƒÂ…Àuó…Àt®t>‹3í…Òt6‹úƒÉÿ3Àò®÷ÑI‹ùGWRVÿ0F‹K‹T$(ƒÄ ‰4©‹B÷E‹¨…Òu΋L$‹SǪf‹Af‰Cf‹Q ‹Æf‰S ƒàº+Ð3Àò‰s ‹Q ‹:…ÿt ‹jƒÂ@…íuõ¿I D†‹÷3Ò‰L$…öt+‹é‹øÁéó¥‹Íƒáó¤‹K ‹t$‰‘‹L$‹v ÁB‹4–…öuÕ‹K ‹|$Ç‘‹+ÁPQÿ¨F‹ð‹ƒÄ;ðt‹Ö+ÐRVèƒÄ‰7‹Æ_^][YËD$V‹t$ W‹8‹Hþ…ɉ8tΉH‹…Òt3ÿփlj‹HÏ‹…Òuî‹H ΉH ‹…Òt3ÿփlj‹P ‹…Òuì_^ËD$VPÿðF‹L$QPÿÐF‹t$PVÿ0FƒÄ ‹Æ^ËD$…ÀtPÿ FYÃV‹t$WVèƒÄƒøÿtVèöƒÄƒøÿuòVè(çÿÿ‹†ŒƒÄ…Àt PèUºÿÿƒÄ‹†¼‚Pè–ÿÿÿ‹ŽÈ‚QèŠÿÿÿІ€‹= FƒÄ„Àt ‹–|Rÿ׃ÄІˆ„Àt ‹†„Pÿ׃ÄІx„Àt ‹ŽtQÿ׃Ä‹–¤Rè3ÿÿÿjjVè9u‹†ÌƒÄ…Àt"P‹†Pè?kƒÄ…ÀthtIVèݹÿÿƒÄ‹F…Àt ‹Ž‹P;Êt‹–RèjjƒÄjVèu‹†œPÿ׋ŽƒQèºþÿÿVèÄx‹FƒÄ…Àt‹PJ‰PVÿ׃Ä3À_^ÃSU‹-¤FVWhƒÿÕ‹ðƒÄ…öu _^]¸[Ã¹Æ 3À‹þhó«ÿՃĉ†¤…ÀuVÿ FƒÄ¸_^][Ãdž¨¡”F‹¾ÐƒÀ ‰F‹ ”F¡ÈF‰N ‹”F‹ ÔF‰FlƒÂ@»ƒÏ¸dž°‚j‰V‰Ntdž˜ÿÿÿÿdž´‚𿉞ðˆžmˆžndž8<ˆžW‰¾Ð‰†(ÇF8dž4‰^8‰^<‰† ÿÕ‹øƒÄ…ÿ‰¾œu‹–¤‹= FRÿ×Vÿ׃ĸ_^][Ã‹Ž 3ÀÁá‹Ñ‰ž Áédžó«‹Êƒáóª‹D$_‰0^]3À[ËD$SV='W“„|ƒÀýƒøo‡ 3ÉŠˆ ç@ÿ$<æ@‹T$‹D$_^‰‚83À[Ë\$…Ûtèìõÿÿ‹L$_^3Àˆ™p[Ët$‹\$;ž }‹û‹–œ‹ºP苆 ƒÄG;ø|ã3ÿ;ßtN‹–œ QRÿ¨F‹ÐƒÄ;×u _^¸[ˆ ;Ã} ‹Ë<‚+È3À󫉖œ‰ž _^3À[ˆœ;Çt Pÿ FƒÄ‰¾œ‰¾ _^3À[ËD$‹L$…À•À_ˆj^3À[ËD$_…À‹D$ ^•ˆk3À[ËD$‹T$…À•Á_^ˆŠh3À[ËD$‹L$…À•À_ˆ[^3À[Ët$‹L$…ö•ÀˆW„À‹Ðt _‰Ð^3À[Ã$ï_‰Ð^3À[ËD$_…À‹D$ ^•ˆ^3À[ËD$‹T$…À•Á_^ˆŠX3À[Ët$‹L$…ö•À„Àˆ`„¶ _^Çð3À[ËD$‹L$…À•À_ˆU^3À[ËT$‹D$_^‰‚”3À[ËD$‹T$…À•Á_^ˆŠT3À[ËD$‹L$…À•À_ˆR^3À[ËT$‹D$_^‰‚d3À[ËD$‹T$…À•Á_^ˆŠY3À[ËD$‹L$…À•À_ˆZ^3À[ËT$‹D$_^‰‚ø3À[ËD$‹T$…À•Á_^ˆŠS3À[ËD$…À„È‹D$_^[Ç€ð3ÀËL$‹T$_^‰‘ä3À[ËD$‹L$_^‰ˆè3À[ËT$‹D$_^‰‚3À[ËL$ŠT$_^ˆ‘Ð3À[ËD$‹L$…À•À_ˆn^3À[ËD$_…À‹D$ ^•ˆm3À[ËD$…À„&‹D$_^[Ç€ðÆ€`3ÀËL$‹T$_^‰‘˜3À[ËD$‹L$_^‰ˆœ3À[ËT$‹D$_^‰‚ 3À[ËL$‹T$_^‰Q03À[ËD$…À„²‹D$_^[Ç€ð3ÀËL$‹T$_^‰Q`3À[ËD$‹L$…À•À_ˆ]^3À[ËD$_…À‹D$ ^•ˆQ3À[ËL$‹T$_^‰Q3À[ËD$‹L$_^‰ˆŒ3À[ËT$‹D$_^‰‚3À[ËL$‹T$_^‰QH3À[ËD$ƒàû„ ‹L$_^[‰A83ÀËD$ƒàû„ð‹T$_^[‰B<3ÀËD$‹L$_^‰ˆ¤3À[ËD$_…À‹D$ ^•ˆÑ3À[ËL$‹T$_^‰‘ 3À[ËD$‹L$_^‰ˆ3À[ËL$‹D$=ÿ?‰< ƒøj_^Ç<3À[ËD$_…À‹D$ ^•ˆo3À[ËL$‹T$_^‰‘43À[ËD$‹L$_^‰ˆL3À[ËT$‹D$_^‰B3À[Ã=}'N„4îØÿÿƒøf‡ï3ÉŠˆ,è@ÿ$|ç@‹T$‹D$_^‰‚$3À[ËL$‹T$_^‰‘3À[ËD$‹L$_^‰ˆ 3À[ËD$_…À‹D$ ^•ˆP3À[ËD$…À„y‹t$P‹ŽŒQèû°ÿÿƒÄ‰†Œ3À_^[Ët$‹T$‰–ÌŠ†Ð‹ŽPQjVèh_ƒÄ‰†3À_^[ËT$‹D$_^‰B$3À[ËL$‹T$_^‰‘¨3À[ËD$‹L$_^‰H3À[ËD$‹L$…À•Â_‰Ad^ˆ‘V3À[ËD$‹L$_^‰ˆ¬3À[ËT$‹D$_^‰‚ô3À[ËD$‹L$…À‰°„–_^Çð3À[ËL$‹T$_^‰Q 3À[Ët$Іx„Àt‹†tPÿ FƒÄƆx‹D$_‰F(‰†tƆy^3À[ËD$‹L$…À‰A\„#_^Çð3À[Ët$Іˆ„Àt‹Ž„Qÿ FƒÄƆˆ‹D$_‰FL‰†„^3À[Ët$І€„ÀtƆ€‹–|Rÿ FƒÄ‹D$_‰F,‰†|^3À[ËD$‹L$_^‰HT3À[ËL$‹D$…À‰AX„€8…v_^ÇAX¤I3À[ËT$‹D$_^‰B43À[ËL$‹T$_^‰‘Ø3À[ËD$‹L$_^‰ˆÜ3À[ËT$‹D$_^‰‚Ô3À[ËL$‹T$_^‰‘€3À[ËD$‹L$_^‰H3À[ËT$‹D$_^‰B@3À[ËL$‹T$_^‰Q 3À[ËD$‹L$…ɉH…‹ ”F_ƒÁ@^‰H3À[ËT$‹D$_^‰‚´3À[ËL$‹T$_^‰‘¸3À[ËD$‹L$_^‰ˆ¼3À[ËT$‹D$_^‰‚À3À[ËL$‹T$_^‰‘Ä3À[Ã_^¸5[ËD$‹L$_^‰Hh3À[ËD$‹L$…À•Â_‰^ˆ‘i3À[ËD$‹L$_^‰ˆ3À[ËT$‹D$_^‰‚3À[ËL$‹T$_^‰‘à3À[Ët$3ÿ9~tIjjVè5i‹FƒÄ ‹H‹;Èu‰>‹V‹Ž‹B;Áu‰¾‹F‹HI‰HjVè‹ìIt‹ˆ¤‹€ Që ‹ˆ¬‹€¨QPRUèGa‹L$ ƒÄ;Á~‰D$‹Þ‹‡ F;ð|¦…Û|‹œ‹™RèÈýÿÿ‹‡œƒÄǘ_^‹Ã][ƒÄ ÃSV‹t$ 3ÛWІ ‹>„Àt_^3À[ÃjWèífЇhƒÄ„Àt‹D$PVè5ƒÄ‹†…Àtèƒ`‰† V‰–¤ÿ–ƒÄ‹Ø_‹Ã^[ËL$‹D$VW‹9…Àt‹ë3À‹Q…Àt‹0ë¾õI‹pPRÿÐFPVhÈIWè?¦ÿÿƒÄ_^ËL$S‹\$VW‹|$D$SPWQÆèQ‹ðƒÄ…öu‹D$…Àu€;u'‹PRè’‹ðƒÄ…öt‹…ÀtPèüÿÿƒÄÇ‹Æ_^[Ãì@ õISUVWˆD$(¹ 3À|$)‹”$`ó«‹Œ$\‹´$Tf«Çƪ‹†tÇD$ …Àu_^]¸[Ä@Ãh ÿ¤F‹èƒÄ…íu‹„$X_^‰(]¸[Ä@ËŒ$X3À‹ýƒËÿ‰)¹ó«‰u‰°‰´‰]‹†|…Àt€8t‹†4…Àu¸ë3Àˆ…ÿÆ…ü‰¸è­^‰…¨‰•¬‹V@…Ò•ˆ•‹F@‹U‰…„‹Ž¤‹…¨‰ˆ‰‚‹¬‰Š‹N4…É•ˆ•‹F…À•Àˆ…‹¾t‹Ë3Àò®÷ÑIù}¹Qÿ¤FƒÄ‰…h…Àu_^]¸[Ä@ËŽt] PShh IQÿ¬FƒÄƒø…œhôHSè £ÿÿƒÄ…À„†‹•h€:/u €z/urƒÉÿ‹þ3Àò®÷ÑQVRÿ8FƒÄ ‹…h€8/t;j/Pÿ˜F‹ÐƒÄ…Òt)ŠB„Àt„øhðÏHVÿäFƒÄ…ÀtƒÀë‹Æj@Pÿ˜F‹ØƒÄ…Û„­Œ$P”$PQRht IVÿ¬FƒÄƒø……‹…˜PèWãÿÿ‹=ŒFŒ$TQÿ׃ĉ…˜…Àu_^]¸[Ä@Ë•œRèãÿÿ„$TPÿ׃ĉ…œ…Àu_^]¸[Ä@ÃCÆ…Sÿ×V‹øÿ FƒÄ‹÷‹„$T‰°|Æ€€Æ…ÿ‹D$…Àt Pÿ FƒÄŠE‹œ$T¨tA‹‹tE QPhl Iè˜ÿÿƒÄ …Àu_^]¸[Ä@Ƀtƃx‹E$þ‰E‹…ˆ3ÿ;Çt>Š„Éu4Phh IT$0j(Rèš—ÿÿD$8PÿŒFƒÄ‰…„Æ…Æ…u h` IVèú›ÿÿƒÄ…ÀtV‹C0;Çt Š‹Í‚„Éu¸P‰…p‹EfÇ…tP ‰EÇ… P¬A‰½Ç…P«AÇ…°ªAééh IVè’›ÿÿƒÄ…Àt/‹C0;Çt Š‹Í‚„Éu¸»‰…p‹EfÇ…t» ë“h IVèQ›ÿÿƒÄ…À„³‹C0;Çt Š‹Í‚„Éu¸F‰…pfÇ…tF‹ ¸Fƒ9~‹•hj¾BPÿ´FƒÄë‹h¡°F¾Q‹ŠQƒà;Çt)‹•hj/BRÿ˜FƒÄ;lj…xu ‹…h‰…x‹EÇ… P¬A ‰½‰EÇ…P«Aéßh IV舚ÿÿƒÄ…À…’hü IVèršÿÿƒÄ…À…|hô IVè\šÿÿƒÄ…ÀtG‹UƒÊ ‰U‹C0;Çt Š‹Í‚„Éu¸‰…pfÇ…tÇ… ÐŒAÇ…ŒAéZhì IVèšÿÿƒÄ…ÀtC‹UƒÊ@‰U‹C0;Çt Š‹Í‚„Éu¸D ‰…pfÇ…tD Ç…  ‰A‰½éhä IVè®™ÿÿƒÄ…ÀtC‹U€Ê€‰U‹C0;Çt Š‹Í‚„Éu¸…‰…pfÇ…t…Ç… `„A‰½é°hX IVèY™ÿÿƒÄ…ÀtH‹]U€ÏÇ… €‚A‰]èi‰ƒÄ;Ç…@WjÿWWjÿjÿUÆ… èø5ƒÄ_^][Ä@ÃVh< ISè^šÿÿƒÄ ¸_^][Ä@Ãhü IVèà˜ÿÿƒÄ…Àt ‹E€Ì‰E‹C0;Çt Š‹Í‚„Éu¸‹u‰…pƒÎfÇ…t‰u‹ƒ|;Ç‹ÎtH€8tCŠƒQ„Àu9öÅth ISè×™ÿÿƒÄ¸_^][Ä@ÃÇ… P¬AÇ…P«Aë2Ç… ðqAÇ…hAÇ… fAÇ… cAÇ…àA‹•x‹5äFBh I‹Â‰•xPÿÖƒÄ;ÇuE`h IPÿÖƒÄ;Çt2¾HQÆÿ4FƒÄ‹µd‹•lFB‹Æj]PÆ…‰µd‰•lÿ˜F‹ðƒÄÆŠFF<:ukë‹dj:QÿàFƒÄ‹ð;÷tQT$~j RWÿÀF‹L$ƒÄ ;Ït5€9u0=ÿÿvPhØISèd˜ÿÿƒÄ ¸_^][Ä@ÃÆf‰…t‹ƒ|…À„“€8„ŠPÿŒF‹ðƒÄ…ö‹þuhÈISè˜ÿÿƒÄ¸_^][Ä@ÃhðÏHVÿäFƒÄ…Àtxj:Wÿ˜FƒÄ…ÀtÆ@PÿôFƒÄë‹C…Àt‰…pWÿŒFV‰…Œÿ FƒÄÆ„$PÆ„$PöE„E‹…dj@Pÿ˜F‹dƒÄ…À„%@‰…l‰…dƒ»d„ Æ…Š”$P<:Rt„$TPh´IQÿ¬FƒÄëh¨IQÿ¬FƒÄ Š„$P„Àt\„$PjP諪ÿÿ‹ÐƒÉÿ‹ú3ÀƒÄò®÷ÑIùs*‹úƒÉÿò®÷Ñ´$P+ù‹Á‰t$‹÷‹|$Áéó¥‹Èƒáó¤Rÿ FƒÄŠ„$P„Àt\Œ$PjQèDªÿÿ‹ÐƒÉÿ‹ú3ÀƒÄò®÷ÑIùs*‹úƒÉÿò®÷Ñ´$P+ù‹Á‰t$‹÷‹|$Áéó¥‹Èƒáó¤Rÿ FƒÄ‹C4…ÀtŒ$P”$PQRhÐ IPÿ¬FƒÄ‹ƒd…ÀtA‹•l„$PŒ$PPQRè[^ƒÄ …Àt‹…lPhlISèr•ÿÿƒÄ ëÆ…öEt$Š…„Àu‹5ŒFh`IÿÖ‰…hHIë‹5ŒFŒ$PQÿÖ”$T‰…Rÿփĉ…”µÌƒVPè ƒÄ„Àu_^]¸[Ä@ʃk„À…ÀL$$QUSèÿƒÄ „À„©‹•h‹…x‹Ý‹­Œ…í‰T$‰D$t Uÿ FƒÄVèd‹l$(Š‹{`3ÀˆƒÉÿò®÷Ñ+ùU`‹Á‹÷‹úÁéó¥‹Èƒáó¤‹5 F‰•l‹‹d‹•h+ËR͉dÿÖ‹D$‹L$‰…h‰xÆ…ýÆ…þÇ…¸ÿÿÿÿ‹“Rè$Ùÿÿ‹ƒ”PèÙÿÿ‹‹˜Qè Ùÿÿ‹“œRèÙÿÿSÿÖ‹„$pƒÄ‹€¤…À‰…ˆtVPhh IL$0j(Qè1ŽÿÿŠ…ƒÄ<u ‹•„RÿÖƒÄD$(PÿŒF‹´$XƒÄ‰…„Æ…Æ…ë5‹´$T‹F@…Àt PÿŒFƒÄ‰…„Æ…Æ…ëÆ…‹Œ$X‰)‹URh IVè “ÿÿƒÄ ëUSèT‹´$\ƒÄ‹Ft‰…ŠE‹N ¨‰t"І`„Àtƒ¾˜ÿu‹Žø¸;Èu3Àˆ…Š…ý„Àt3À‰D$‰E éÀ‹†|…Àt[€8tV‹…p‹ŒT$RPQUèGÑÿÿƒÄƒøu‹”$`ˆé‚‹D$…Àuz‹…ŒPhIVèÇ’ÿÿƒÄ ÇD$ ë[‹•d3Àf‹…tL$QPRU‰…pèèÐÿÿƒÄƒøu ‹„$`Æë%‹D$…Àu‹dQhèIVèj’ÿÿƒÄ ÇD$ ‹”$\‹D$‰‹D$ _^][Ä@ÃSU‹l$ 3ÛVW‹… …ÀŽ€‹|$‹…œ‹4˜…ö„&‹G‹N3ÈöÅ…Šÿ„ÉtJöÄuXІÿ„À„ø‹–Œ‹‡ŒRPèrÿÿƒÄ…À„Ú‹p‹†p;È„ÖéÁöÄuІÿ„À…®V G RPè.ÿÿƒÄ…À„–‹Žd‹—dQRèÿÿƒÄ…Àt|f‹‡tf;†tul‹GöÄtŽÌ—ÌQRè ƒÄ„ÀtJ‹G¨u¨tO‹ƒ¸ä‚uD‹Ž‹—QRè®ÿÿƒÄ…Àt‹†”‹”PQè”ÿÿƒÄ…Àu‹… C;Ø}:é¹þÿÿ‹–°RèAƒÄ„Àt)Shx IUèNÿÿVèøæÿÿ‹…œƒÄǘ_^]2À[ËL$_°‰1^][Ãì ‹„$T$S3ÉRQ‰L$ ‰L$Q‰D$L$@»QP‰\$ ÿàF…Àu 2À[Ä ÊÃ[Ä ÃVW‹|$ 3ö‹‡ …À~‹œƒ9tFƒÁ;ð|ó;ðuWèáçÿÿ‹ðVhœ IWèƒÿÿƒÄƒþÿt‹œ‹D$‰±‰p‹Æ_^ÃV‹t$Wj‹>WèpO‹FƒÄöÄ…¨u‹‡|…Àt/€8t*‹GT…Àt#‹†<Pè;Ôÿÿ‹OTQhà Iè­‰ÿÿƒÄ ‰†<‹GX…Àt#‹–@RèÔÿÿ‹GXPhÈ I胉ÿÿƒÄ ‰†@‹†°dž|ƒøÿdž€u@‹|$L$QWVè{ŠL$ƒÄ „ÉtWVè©çÿÿƒÄ…ÀuTƆ ë8…ÀƆ t-_^ÃjWè“NƆ ЇhƒÄ„Àt‹T$RVèÔçÿÿƒÄè,H‰† ‰–¤3À_^ËD$ SUV‹t$W‹|$L$‹–pž°PQSRWVèµA‹èƒÄ…í…ˆF3ɋЉ~ ‰ ‰J‰J‰J ‹L$‹‰V‹f‹Qf‰f‹†pPÿÌF‹f‰F‹4ƒøu&‹ ‹–œ‹†˜QVRPè;ƒÄ÷Ø_^À]ƒà[Ã…Àthô IQèíÿÿƒÄ¸_^][Ã_‹Å^][ÃìdSUVW‹¼$„jWè@‹´$€ÆD$&ÆD$'‹¬$ˆŠL$„À•À@QˆD$)‹T$)âÿD$(ƒÂÆD$(RPWUèÏŽÿÿƒÄ…À…Á‹L$‹D$áÿƒÁ;Á…¨T$D$RjPWUèxÿÿƒÄ…À…ƒ|$…t€|$t‹MhDIQésŠD$„À„Ù<…‹þƒÉÿ3ÀÆD$ò®‹¼$|÷ÑI‹ÙƒÉÿò®÷ÑI|$‹Á‹Ë‹Ñˆ\$Áéó¥‹ÊƒÃƒáC󤋴$|ˆD‹È|‹ÑØÁéó¥‹ÊD$ƒáP󤋴$ˆL$ SQVUèßÿÿƒÄ…À…Š;\$…€T$D$RjPVUè—ÿÿƒÄ…À…Wƒ|$…L€|$… ŠD$„À…þ‹þ‹…l3Òf‹•tL$QRPUÆD$,ÆD$-ÆD$.ÆD$/èHÊÿÿƒÄƒøÿu_^]¸[ÄdÃøuL$QUè ÍÿÿƒÄ‹T$…Ò„m‹…À„c‹H ‹ …É„VŠ RˆL$$‹H ‹ ŠIˆL$%‹H ‹ ŠIˆL$&‹@ ‹ŠA‹MQˆD$+èÖÌÿÿf‹•tƒÄRÿÌFf‰D$$D$¾ PL$ VQWU詌ÿÿƒÄ…À…Ü9t$…ÒT$D$RVPWUèbŽÿÿƒÄ…À…§9t$…€|$t‹Mh IQé^ŠD$„Àth‹T$‹D$$âÿRPÿôF‹L$'‹T$&%ÿÿáÿP‹D$)Q‹L$,âÿ%ÿR‹UáÿPQhÐ IR蛊ÿÿƒÄ ¸_^][ÄdÃjWèÐ<ƒÄ3À_^][ÄdËEh  IPéÈ‹Mhx IQ麋•l‹ERhL IPè?ŠÿÿƒÄ ¸_^][ÄdËL$‹T$‹EáÿâÿQRh IPèŠÿÿƒÄ¸_^][ÄdËMhè IQëPh¸ IëE<u ‹Eh| IPë:<ÿu€>u ‹MhÐ IQë&h¤ Ië‹Ehh IPë‹Mh< IQë h I‹UR蕉ÿÿƒÄ¸_^][ÄdÃUV‹t$ W‹= FІ‹.„Àt‹†„Pÿ׃ÄƆ‹†\…ÀtPÿ׃Ädž\‹F …Àt ‹PQèŠÊÿÿƒÄ‹†…Àt VÿЃÄ‹øë3ÿVè;HŠ…jƒÄ„Àu&…ÿu Іü„Àu‹VRh|IUèqˆÿÿƒÄ ‹Ç_^]ÃVèßÿÿƒÄ_^]ÃS‹\$V3À‹3W‹Ž ‹>…Ɉ†tuVÿуăø7ujŠŽý„Ét`h˜IWèˆÿÿVƆüèöþÿÿƒÄ …ÀuAD$PSWèÃáÿÿƒÄ …Àu.ŠD$„ÀtjVèÊÿÿƒÄ…ÀuVèՃąÀu Vÿ– ƒÄ_^[ÃV‹t$W‹|$‹;u}‹N‹G;Èus‹V ‹G ;Ðui‹G‹NPQèoƒÄ„ÀtU‹W‹FRPè[ƒÄ„ÀtA‹O‹VQRèGƒÄ„Àt-‹G‹NPQè3ƒÄ„Àt‹W ‹F RPèƒÄ„Àt_°^Ã_2À^ËL$‹D$…Ét…ÀtPQè †ÿÿƒÄÃ…Àu¸Ã3ÀÃSV‹t$W‹|$‹ŒF‹G ‰F ‹O‰N‹‰‹G…ÀtPÿӃĉF…Àu_^2À[ËG…ÀtPÿӃĉF…Àu_^2À[ËG …ÀtPÿӃĉF …Àu_^2À[ËG…ÀtPÿӃĉF…Àu_^2À[Ë…ÿtWÿӃĉF…Àu_^2À[Ã_^°[ÃV‹t$W‹= F‹F…ÀtPÿ׃Ä‹F…ÀtPÿ׃Ä‹F …ÀtPÿ׃Ä‹F…ÀtPÿ׃Ä‹v…ötVÿ׃Ä_^Ãì,SU‹¬$8VW‹=àF‹E‹Ü‹µØ‰D$Š…ðÇD$¨‰\$$t,…öu(‹…$hXöI‰D$‰…´‰•¸‹D$ÇD$…ÀŽ9‹•ÌÆŠ€‹…Ì„ɉ…”„Œ j PÆD$#‰…˜ÿ˜FƒÄ‰…œ…À„ñ ‹…œ‹•”‹\$‹ð‹½˜+òF+Þ@‰…”+Ç‹|$‰\$‹Ø‹…‹¨Ã;Á|]@É™+ÂÑø;Á‰D$,‰L$,‹L$‹T$,‹½ŒR‹¤P+øÿ¨FƒÄ…À„„‹L$‹T$,‰¤lj‘¨‰…Œ‹ù‹…˜‹ŒSPQÿ0F‹•Œ‹Óˋ‰•Œ‰ƒÄ Æ‹•Œ‰•œ‹‡¤‰… ‹…ˆ…Àu!ƒ½~‹¤QWèNƒÄ„À„¾ ‹… Š€ù „0€ù „,‹ˆ…ÉQ‰•ˆ…”‹¬F½¬µ°WL$4VQh|IPÿӃăø…ò‹D$0€‹Ñ≋\$‹‰ƒð‚ŠƒX‹„À‰‹ø‚t ?uƒ> uÆ…ü‹?ïÌt ƒïdtƒïpu3À‰…(‰…¸½¬ „Õ‹• jRhlIè[ÿÿƒÄ …À„·‹… ‹=¬FµlƒÀVhdIPÿ×ƒÄ …À„”‹D$‹ˆL…Ét9ÿ‹ƒì‰(ÛÝ$Pè›CƒÄ éO‹… WhXIPÿÓƒÄ Ç …À…ýþÿÿ‹ ‹\$QSèƒĄÀ„] ÇÈ‹‹ø3Òƒù•ƒ ‰éÇþÿÿ‹=¬F‹• j RhHI耀ÿÿƒÄ …À„ÿ‹µ ƒÆ Š„Àt;‹=´F‹ ¸Fƒ9~ ¾ÐjRÿ׃Äë‹ °F¾À‹ŠBƒà…ÀtŠFF„ÀuË‹˜Fj VÿÓ‹øƒÄ…ÿuj VÿÓ‹øƒÄ…ÿ„a‹´F¡¸Fƒ8~ ¾jQÿÓƒÄë¡°F¾‹ŠQƒà…Àt;þvOë΋T$+þG‹‚ƒ‹ßPè¨ÅÿÿKQÿ¤F‹T$ƒÄ…À‰‚ƒ„ˆ‹Ë‹ø‹ÁÁéó¥‹Èƒáó¤‹Ê‹‘ƒÆéÒ‹…°» ;Ã…ˆŠ…ÿ„Àt;‹… h<Ih(IPè“ƒÄ „Àt‹L$høIQÆ…üèöÿÿƒÄéz9°u;‹• h<IhìIRèÀ’ƒÄ „Àt‹D$hÄIPÆ…üè³ÿÿƒÄé7‹ h¼IhìIQè…’ƒÄ „Àt Æ…üé‹• h´Ih IRè\’ƒÄ „ÀtUÆ…þèØ«ƒÄéÜ‹… jPhŒIèm~ÿÿƒÄ …À„‹L$‹AX…À„‹µ ƒÆŠ„Àt;‹=´F‹¸Fƒ:~ ¾ÀjPÿ׃Äë‹°F¾È‹ŠHƒà…ÀtŠFF„ÀuËjVh¤Ièü}ÿÿƒÄ …ÀtÇ…ÀéBjVh„IèÙ}ÿÿƒÄ …ÀtÇ…ÀéjVh|Iè¶}ÿÿƒÄ …ÀuNjVhtIè¢}ÿÿƒÄ …Àu:jVhhIèŽ}ÿÿƒÄ …ÀuSVh\Iè{}ÿÿƒÄ …À„ÌÇ…Àé½Ç…À鮋 jQhLIè?}ÿÿƒÄ …ÀtX‹• µ¨VƒÂh@IRÿ×ƒÄ …Àu‹… VƒÀh4IPÿ×ƒÄ …À„X‹ˆ‹;È…HÆ…¤é<‹t$‹†…Àth‹• j Rh(Iè¿|ÿÿƒÄ …ÀtNjjVè®8‹…XƒÄ …Àu‹…d‹x‹• QƒÂ P‹†RjPVè!jVè²8ƒÄ éÊ‹ jQhIèW|ÿÿƒÄ …ÀtV‹†ä…Àu ІP„ÀtBjÿÌF‰D$$‹… T$$ƒÀRP蜣ÿÿ‰…ÄŠŽPƒÄ „É„a‰†ü‚éZ‹ jQhIèç{ÿÿƒÄ …Àt ‹…¬=‘t'‹• jRhðIèÀ{ÿÿƒÄ …Àt+‹…¬=—u‹ QPUè.ƒÄ …À…© éî‹…¬=,ŒÙ=΋• j RhäIè_{ÿÿƒÄ …À„°Š†Y„À„¢‹½ ‹´FƒÇ Š„Àt5‹ ¸Fƒ9~ ¾ÐjRÿÓƒÄë‹ °F¾À‹ŠBƒà…ÀtŠGG„ÀuË‹µœN;÷r0¡¸Fƒ8~ ¾jQÿÓƒÄë¡°F¾‹ŠQƒà…ÀtN;÷sЊ^F;÷tWÆÿŒF‰…\ƒÄˆ‹t$І[¿„Àt¿Іh„Àt‹•‹… RPjVèüÿÿƒÄ‹‹• QRWVè4~ÿÿƒÄ‰D$(…À…[ ‹…‹ŽƒÈ‰Žƒ‹‹…€Á‰…€‹–¤‰•ŒÇ…éf€ù u@‰… ‹… €8 u@‰… ƒ½¬d…„Š…¼Æ…€„ÀÇ…ˆtp‹äµä3ÀÆ…¼…Év‹½0•è9:t@ƒÂ;Árô;Áuƒù@s‹0‰Œ…è‹@‰‹…ð½ì ¹A‰…ðó¥ëÆ…€½¬¡u‹…ðÆ…¼$ý3Û‰…ð‰ìë3Û‹|$¹Ї[„Àt¹‹‡¤‹µ +ðVPQWèÐ|ÿÿƒÄ;ÉD$(…÷ ‹ƒUΉƒ‹…€Ɖ…€è_†Š…€ƒÄ„À„]‹—¤‰‰•Œ‹…”€8„–j P‰…˜ÿ˜FƒÄ‰…œ…À…õÿÿ‹…‹L$‹|$Á‹¨;Á|F@ ™+ÂÑø;Ã~‹Ø‹‡¤‹µŒSP+ðÿ¨FƒÄ…À„ª‰‡¤ƉŸ¨‰…Œ‹L$‹µ”‹½Œ‹ÑÁéó¥‹Êƒáó¤‹D$‹µŒ‹•‹ˆðЅɉµŒ‰•‹Â…ȃøŽ¿‹D$‹ˆ¤QPè¥ ƒÄ„À…£ˆ…€Ç…„鎋D$Æ…€…Àt Ç…„ësÇ…„‰t$ëcÆ…€ëZЇ^„ÀtÆD$ë‹…(ƒøÿt‰…¸9¸uÆD$ëŠD$„Àt!‹ðŠD$ƒáþ‰è„À‰ð…¡‹…”…À„“Š…€„À……‹D$…ÀŽy‹…È3ÿ;Ç…öE„“9½\t)Š…ü„À…«‹t$hÈIVÆ…õèYwÿÿƒÄë‹t$9½ˆtŠ…¤„Àu ƒ¾ð„˜‹†ä;Çt99½„u1‹•Ä;×~'‹Žè;Ï~ƒèt ;ÑŒƒë;Ñžë‹t$‹ÈA‰ÈІh„ÀtQ9½„t2‹•‹†¤RPjVèy{ÿÿ‹…„ƒÄƒøu%‹L$‹•”QRë ‹D$‹”PQjVèI{ÿÿƒÄŠ…þ„Àt;‹D$‹”T$RPQU裃Ä;Ç)ƒøÿu‹…ð‰½è$þ‰…ð‹…¸ƒøÿt0‹d‹T$Ñ;Ð| +Á‰D$y‰|$‹…ð‰½è$þ‰…ð‹D$‹d؃ì‹Ë‰d‰L$(ÛD$(Ý$VèŽ7Š…þƒÄ „À…§‹D$…Àu‹…„…À„‘‹…„…Àt)Š…õ„Àu‹t$‹•R‹†¤PjVè™xÿÿƒÄë‹D$(‹t$ƒ½„}!Šõ„Éu‹L$‹•”QRjVèexÿÿƒÄ…ÀÇ…„…†ë‹…ðÇ…è$þ‰…ðö…ð„„‹D$$3ÿ;ÇtP‹…0Pè‚£…À„e9½du9½hu‹t$jVèþ4ƒÄë‹t$‹T$‹ø¸ Ð;ωT$…é‹Ð‰üŠô„É…šн„Ét‹•`9BX„›h@UèÚƒÄ;ljD$Žk‰…øŠŽÑ„É„ˆ9¾È‚u&h€ÿ¤F‰†È‚‹ŽÈ‚‹D$ƒÄ;Ï„:3Ò3É;Ç~8‹…üŠ< u‹†È‚AÆDÿ ‹†È‚Æ ë ‹žÈ‚ˆ ‹D$BA;Ð|È;Èt‰L$‹–È‚‰•ü‰ø‹ø‹•üD$$P‹…0QRPUèuÿÿƒÄ;Ç…êІh„Àt‹L$$‹•üQRjVèFxÿÿƒÄ‹…ø‹L$$;Át+Á‰…ø‹…üÁ‰…üë0‹…Љ½ø‰…üŠ…ô„Àt‹…ð‰½ì$ý‰…ð‹½hƒìù‹Ï‰½h‰L$(ÛD$(Ý$VèÉ4ƒÄ ës‰|$‹…ð‰½ì$ý‰…ðëYµä½ì¹AÆ…½ÇÆ…¼ó¥‹ð¾ýÿÿÿ#Ήðè‹,‰…´‹D$#Ɖ•¸‰D$‹t$èl,‰…x‹D$…À‰•|„£‹…,…Àt‹d‰‹…4…À„'‹•h‰éh IWè¬rÿÿƒÄ¸_^][Ä,ËT$h IRèŠrÿÿƒÄ¸_^][Ä,Ë…¬PhxISèerÿÿƒÄ ¸_^][Ä,Ãh\IPèGrÿÿƒÄ¸?_^][Ä,Ë…ð‹Œ$D$þ‰½è_‰…ð^]Æ3À[Ä,ÃhIVèþqÿÿƒÄ¸!_^][Ä,ÃhðIVèpqÿÿ‹”$LƒÄ3À_^]Æ[Ä,ÃhÄIVèKqÿÿ‹„$LƒÄ_^Æ]3À[Ä,Ãøuh°IVè‘qÿÿƒÄ¸_^][Ä,ÃPh„IVèrqÿÿƒÄ ¸8_^][Ä,ÃhdIVèTqÿÿƒÄ_^]¸[Ä,Ê…¼„À„–‹…¸‹´‹•|P‹…xQRPè¢*ƒÄ=è~k‹äµä3ÀÆ…¼…Év‹½0•è9:t@ƒÂ;Árô;Áuƒù@s‹0‰Œ…è‹@‰‹…ð½ì¹A ó¥‹t$‰…ðUèw2ƒÄ…Àt_^]¸*[Ä,Ë•|‹…xRPV講ƒÄ …À…7‹†Œ…Àtm‹t‹•p‹…|Q‹xRPQèÆ)‹È¸ÓMb÷éÁú‹ÂƒÄÁèЋ†Œ;Ð|,‹(‹•dQRh,IVèýoÿÿƒÄ¸_^][Ä,Ë…ð…À…¤Š†^„Àu?‹…l…Àt5‹d;Èt+‹•\…Òu!+ÁPhüIVè¦oÿÿƒÄ ¸_^][Ä,Ê…þ„Àt,‹…`‹@@…ÀtPhÈIVèpoÿÿƒÄ ¸_^][Ä,ÃUè71ƒÄ…Àt_^]¸*[Ä,Ë…ð…À‹”$D”Áˆ 3À_^][Ä,Ãƒì ‹D$S‹\$UŠ‹„Ét‹‹üƒÀôƒÁ ‰‹ü‹‹‹“üQPjRÿ“‹èŠƒƒÄ„ÀunŠƒ„ÀtdVWUhŒID$j Pè³hÿÿ‹»ü‹È‹Ñ+øt$ ‰»üÁéó¥‹ÊƒÄƒáèó¤_;è^~‹ƒüf‹ TóHf‰ (ƒÅ‹Å][ƒÄ ÃÆƒô‹Å][ƒÄ ËD$S‹\$ V‹°DW…öt$‹ƒÉÿ‹ú3Àò®÷ÑIQSRèÕlÿÿƒÄ …Àu ‹v…öuÜjSh”IèºlÿÿƒÄ …À_^•À[Ã_^°[ÃSUV‹t$W¹%®d3À‹ýó«è2'‰E ‰U‹E ‹ÊƒËÿ‰E‰MÆE‰]L‹>—¬‡­B‰Uh‰El‹†$‹Ž0;Á‹Á@j‰Ep‹¤W‰M(Æ…‘è-Wè˜jjWè¥.jjWè‹.ІƒÄ$„Àu=ÆE‹†(…À‰D$~ÛD$ƒìÝ$Wè|.ƒÄ І„ÀuЇ^„À…³U|Ç‹†$;Ãt‰…€‹ ‹…ŒA ‰ ‰…Œ…€Ç‹Ž0;ËtSŠl¿„Ét%‹ž`9{Xu‹M ÆEX‰MP‹M‰MTë'„ÉtÆEY‹Ž0‰„‹0‹ŒF ω0‰Œ½„¹A‹ò󥽈¹A‹ðó¥_^]3À[ÃSV‹t$ 3Û9žtu^¸[ˆ(PVèË—ÿÿƒÄ;Ã…ŽW‹¾Œ;û‰^Dˆž¸‚ˆžÌ‚‰žà‚tUjjVè¦&ƒÄ ;ût'ŠŽÐ‹–‹QRPVèH‰†‹ƒÄ;ûuÙjVè°&‹ŽŒQèkÿÿƒÄ ‰žŒVƆ͂èþ Vè˜,ƒÄ3À_^[Ãì SUV‹t$0W‹FH…Àt!9FD|Ph@IVèMkÿÿƒÄ ¸/_^][ƒÄ ËNDІ]‹=ŒFA„ÀƆ¸‚‰NDt3Іˆ„Àt‹†„Pÿ FƒÄ‹ŽtQÿ׃ĉ†„Ɔˆ‹\$8T$D$ RPh0ISÿ¬FƒÄƒø„¤‹Žt‰\$Qÿ׋ðƒÄ…ö‰t$u _^]¸[ƒÄ Ãh,IVÿäF‹øƒÄ…ÿu‰t$‹þëƒÇ‰|$€;/„á‹5àFj?W3íÿփąÀtÆj/WÿփąÀtÆj/Wÿ˜FƒÄ…Àt@‰D$ëÇD$Š °.:Èu+€{/uƒÃ‰\$8u8Cu€{/u ŠKƒÃE:Ètê‰\$‹D$…Àt!‹ÕM…Òt‹|$j/WÿփąÀtEÆ‹ÅM…Àuæ‹t$S跋ЋþƒÉÿ3Àò®÷ÑI‹ÙLQÿ¤F‹èƒÄ…íu'_^]¸[ƒÄ ÃÆëÀj/Wÿ˜FƒÄ…Àt´Æë¯‹Ë‹ý‹Ñ‹D$Áéó¥‹Êƒáó¤€8/t‹L$…Ét€9tÆ+/CP+Pèu‹L$@‹5 FQÿÖ‹T$(RÿÖ‹t$DƒÄ‰l$8‹ÝëEj SƆ͂ÿ˜FƒÄ…Àt.Sèõ@Pÿ¤F‹øƒÄ…ÿtSWèSÿ FƒÄ ‰|$8‹ßІx„Àt‹†tPÿ FƒÄëƆxShIV‰žtè8hÿÿ‹†ð‚ƒÄ =-tC~i=/b‹Žð¸;ÈtS‰†ðІ^„À¸øIu¸ôIPhÔIVèêgÿÿƒÄ ë(‹†ðƒøtƒøuhœIVèÊgÿÿƒÄdžðjVèÕ'Vè'ƒÄ 3À_^][ƒÄ ËL$3À‹ÑSŠ ³„Ét€ù t€ù?u2Û@ŠJB„Éuë[ÄÛtñƒÀëí‹L$‹D$SVв„Û‹ñt/Š€ù t €ù?u2Òˆë„Òt Æ%@Æ2@Æ0ëÆ+ŠN@F„ÉuÑ^Æ[ÃQSUW‹|$3ÛW‰\$3íLJè ûÿÿƒÄ;Ã…¶VjWèü&D$ L$PQWˆŸyè–Àÿÿ‹ðƒÄ;ó…f8\$t/‹T$SRèè¨ÿÿ‹ðƒÄ;ó…H‹D$PèA´‹ðƒÄ;ó…13ÀЇy;ÃtY‹L$Qè^Ýÿÿ‹ðƒÄ;ó…‹—tRÿŒF‹è‹D$PWèGûÿÿ‹ðƒÄ ;ó„Vÿÿÿ‹L$Qÿ FƒÄ;ó…Ñé;ÿÿÿT$RèÅÝÿÿ‹ðƒÄ;󅵋D$‹HöÅt ˆ˜¼‹D$PèÌ‹ð‹D$ƒÄ‹HöÅt Æ€¼‹D$;óu‹ˆ\;ËtQÿŒFƒÄ‹èë/3íë/Æ€ü‹D$‹ˆ´ƒùÿtQÿìF‹D$Ç€´ÿÿÿÿ‹D$PèkÜÿÿƒÄ;óu!;Ëðu;ët%UWècúÿÿ‹ðƒÄ;óu3íéoþÿÿ;ët Uÿ FƒÄWèﲃÄ;óu;Ãt‹ð‹Æ^_][YÃìSU‹l$VWU‹uÆD$ è—÷ÿÿ‹$ƒÈÿƒÄ;Èu 9…0„ËŠ…„ÀuІ^„À…³…à䉅؊D$„À‰Ü…¹Aµè½à‹•Øó¥¹Aµì‹ûD$ó¥‹ÜP‹…ÔjQRPÇD$$ÇD$(ÿàFƒøÿt…ÀtL$QëT$RUè`ÞÿÿƒÄ…Àuë ÿøFƒ8u ŠD$„À„qÿÿÿ3À_^][ƒÄËD$…Àu¸+ËL$‹T$ ‰ˆ$ŠL$‰(‹T$ˆˆ‹L$‰,‹T$‰ˆ0‰43ÀËD$ S‹\$ VW‹|$ Q‰GÇG ‰_ÿ¤FƒÄ‰…ÀtU3ö…Û~hP/Aè-’‹ƒÄ‰²‹ƒ<°t F;ó|á_^3À[ËÎN…Ét‹j‹²Pè.“ƒÄ‹ÎN…Éué‹Rÿ FƒÄ_^¸[ÃV‹t$ W‹= F‹F…ÀtPÿ׃Ä‹‹L$ PÿQVÿ׃Ä_^ÃVjÿ¤F‹ðƒÄ…öt%‹D$ ‹L$PQVèÿÿÿƒÄ …ÀtVÿ FƒÄ3À^ËÆ^ÃS‹\$U‹l$VWSUè‹L$3ÒƒÄ÷q‹‹<‰|$‹7…öt#‹>SU‹O‹WQR衃Ä…ÀuB‹v…öuá‹|$‹t$ VSUèÃƒÄ …Àt:‹WPRWè!‘ƒÄ …Àt(‹D$_‹H A‰H ‹Æ^][ËD$ ‹L$PÿQ‹ƒÄ_^][Ã_^]3À[ËL$‹D$¸;ÊsV‹ðÁæÆ¾13ÆA;Êrï^ËL$‹D$V;ÈWu‹t$ ‹|$ŠŠ:Âu3Òó¦u_¸^Ã_3À^ÃVj ÿ¤F‹ðƒÄ…öt‹D$PÿŒF‹L$‹T$ƒÄ‰F‰N‰‹Æ^ÃS‹\$U‹l$VWSUè=ÿÿÿ‹L$3ÒƒÄ÷q‹‹‹2…öt‹>SU‹O‹WQRèEÿÿÿƒÄ…Àu‹v…öuá_^]3À[Ë_^][ÃV‹t$W3ÿ‹F…À~‹V‹ ¸Q赋FƒÄG;ø|é‹Rÿ FƒÄ_^ÃQS‹\$ 3À‹K‰D$…É~RUVW‹ ‹,‹u…öt4‹‹~‹‹D$RPÿT$(ƒÄ…ÀtSVUè΋C ƒÄ H‰C …ÿ‹÷uЋD$‹K@;Á‰D$|´_^][YÃV‹t$…ötVèAÿÿÿVÿ FƒÄ^ÃV‹t$W3ÿ‰¾ð‰¾ø‰¾‰¾‰¾Ø‰¾‰¾ô‰¾ü‰¾‰¾ ‰¾Ü‰¾‹†ƒ‰¾ð‚;lj¾ø‚džü‚ÿÿÿÿt Pÿ FƒÄ‰¾ƒ‰¾ƒ‰¾ƒ_3À^ËL$V‹ÑWâð3ö3À3ÿút*ú tú0u‹D$…Àu_¸+^ËT$‹ò…Òëì‹T$…Ò‹útäù0M„-ù ±„šù atNét,ƒétƒéu¤‹D$ ‹ˆ@3À‰_^ËT$ ‹‚ƒ‰_3À^ËL$ ‹t…Àu¸õI‰_3À^ËT$ _‹‚ð‚‰3À^Ãé tI…Hÿÿÿ‹L$ _3À‹‘ƒ‰^ËD$ _‹ˆƒ3À‰^ËT$ _‹‚‰3À^Ãòÿßÿƒø ‡ÿÿÿ3ÉŠˆè5Aÿ$Ð5A‹T$ _‹‚ô‚‰3À^ËL$ _3À‹‘ü‚‰^ËD$ _‹HD3À‰^ËT$ _‹‚ ƒ‰3À^ËL$ _3À‹‘ƒ‰^ËL$ _^‹‘؉‹‰Ü‰H3ÀÃÁüÿÏÿƒù‡|þÿÿÿ$ô5A‹L$ _^‹‘ð‰‹‰ô‰H3ÀËL$ _^‹‘ø‰‹‰ü‰H3ÀËL$ _^‹‘‰‹‰‰H3ÀËL$ _^‹‘‰‹‰ ‰H3ÀËL$ _^‹‘¸‰‹‰¼‰H3ÀËL$ _^‹‘°‰‹‰´‰H3ÀËL$ _^‹‘à‰‹‰ä‰H3ÀËL$ _^‹‘艋‰ì‰H3ÀËL$ _^‹‘ ‰‹‰¤‰H3ÀËL$ _^‹‘¨‰‹‰¬‰H3ÀËL$ _^‹‘‰‹‰‰H3ÀÃI>4AO4A-4A]4An4A$3A¯4AÉ4Aã4A5A15AK5Ae5A$3A$3A$3A$3A5A™5Aý4A$3A³5Aì SUVWjÇD$ ÿÌFj,‰D$(ÆD$ÿ¤F‹ØƒÄ…Û‰\$„% ¹ 3À‹ûó«Š„$0 „À„ ‹´$4 ‹=˜Fj;Vÿ׋芃ĉl$„Àt9‹ ¸Fƒ9~¾ÐjRÿ´FƒÄë‹ °F¾À‹ŠBƒà…ÀtŠFF„ÀuÇj=Vÿ׃Ä…À„·…ít;膫„$$L$$PQhŒIVÆ„$4ÆD$4ÿ¬FƒÄƒøŒ±¼$$ƒÉÿ3Àò®÷ÑI‹ñtF‹¸Fƒ:~¾„4#jPÿ´FƒÄë‹°F¾Œ4#‹ŠHƒà…Àt Æ„4#Nuº´$$‹ ¸Fƒ9~¾jRÿ´FƒÄë‹ °F¾‹ŠBƒà…ÀtFëÌD$$Ph„IèYÿÿƒÄ…ÀtVÿŒFƒÄ‰C éóL$$Qh|IèuYÿÿƒÄ…À„ÚŠ‹Æ€ù.½uF‹=˜Fj.Pÿ׃Ä…Àt@E…Àuî¿`I‹VRèӃĄÀu ƒÇÿ|IråëEƒý}$‹„$( VhLIPÆD$èñYÿÿ‹l$$ƒÄ éd‹„$8 …Àt4‹ÈQVèƒÄ„Àu$‹”$( VhIRÆD$è²Yÿÿ‹l$$ƒÄ é%Š‹Æ€ù.uFPÿŒF‹l$ƒÄ‰CÆCéÿD$$PhDÒHèXÿÿƒÄ…ÀtVÿŒFƒÄ‰C é×L$$QhIèYXÿÿƒÄ…Àt-VÿŒF‰C$ŠƒÄ€ù"u@PÿôF‹L$$ƒÄÁ‰Cé”T$$Rh IèXÿÿƒÄ…Àt$VÿŒF‰CD$$Œ$(PQè“ÿÿƒÄ ‰CëZ‹C…ÀuS‹=ŒFT$$Rÿ×V‰Cÿ׃ĉCë8„$$PhIVÿ¬FƒÄ …ÀtŒ$$QhøIèœWÿÿƒÄ…ÀtÆC(…ít€}tyu…öt<‹=´FŠ„Àt0‹¸Fƒ:~ ¾ÀjPÿ׃Äë‹°F¾È‹ŠHƒà…ÀtFuÊ‹=˜Fj;Vÿ׋èƒÄ…í‰l$…˜üÿÿ€>tUVÿ׋èƒÄ…í‰l$…~üÿÿŠD$„À…Ê‹C…À„¿‹C…Àu‹„$8 …Àt PÿŒFƒÄë3À‰C‹C …ÀuS‹´$< …ötHj/VÿàFƒÄ…Àt8+Æ@‹èMQÿ¤F‹T$ƒÄ…À‰B t‹Í‹ø‹ÁÁéó¥‹Èƒáó¤‹Ê‹Q Æ*‹Œ$, ŠA„À…gŠQ„Ò„\‹T$‹r…ö…QR蘃Ä3À_^][Ä ËC‹5 F…ÀtPÿփċC…ÀtPÿփċC …ÀtPÿփċC…ÀtPÿփċC…ÀtPÿÖƒÄSÿÖƒÄ3À_^][Ä Ë´$4 €>#„å‹=˜Fj Vÿ׃Ä…ÀtÆj Vÿ׃Ä…ÀtÆD$PhôIVèš‹ðƒÄ …ö„¤j:Vÿ׃Ä…À…”‹-ŒF‹þ3Ûƒû‡ ÿ$°?A€?.uGWÿÕ‹L$ƒÄ‰AéíhìIWè@Uÿÿ‹T$ƒÄˆBéÓ‹÷¸ìIŠŠÊ:u„ÉtŠPŠÊ:VuƒÀƒÆ„Éuà3ÀëÀƒØÿ…ÀtC‹÷¸äIŠŠÊ:u„ÉtŠPŠÊ:VuƒÀƒÆ„Éuà3ÀëÀƒØÿ…ÀtWÿÕ‹L$ƒÄ‰A ë\hT IÿÕ‹T$ƒÄ»‰B hìIWè™Tÿÿ‹L$ƒÄˆA(ë/WÿôF‹T$ƒÄ‰BëWÿÕ‹L$ƒÄ‰Aë WÿÕ‹T$ƒÄ‰BD$PhôIjèM€ƒÄ ‹øC…ÿ…ÌþÿÿƒûuhõIÿÕ‹L$ƒÄ‰Aéªýÿÿƒû„¡ýÿÿ‹T$RèaƒÄ3À_^][Ä ËT$ˆB)‹)…íÆD$„r‹t$‹M‹FPQèÚSÿÿƒÄ…ÀtW‹E…Àt‹N…ÉtQPè¾SÿÿƒÄ…Àt;ë …Àu5‹F…Àu.‹E …Àt‹N …ÉtQPè•SÿÿƒÄ…Àu#ë …Àu‹F …ÀtÆD$‰l$‹m…í„ô뀊F)ÆD$„ÀuXŠE)„ÀtQ‹|$‹5 F‹G…ÀtPÿփċG …ÀtPÿփċG…ÀtPÿփċG…ÀtPÿÖƒÄWÿÖƒÄ3À_^][Ä ËD$‹U‹ F‰‹E…ÀtPÿӃċE…ÀtPÿӃċE…ÀtPÿӃċE …ÀtPÿӃċE…ÀtPÿӃċE …ÀtPÿӃċE$…ÀtPÿӃċD$¹ ‹ð‹ýó¥PÿӃĉl$‰l$‹m…íuõ‹¼$, ŠG„ÀtBŠD$„À¸ØIu¸ÐI‹t$‹N‹V Q‹NR‹VQ‹NR‹”$8 QPh˜IRèSÿÿƒÄ ë‹t$ŠD$„Àu ‹D$…Àt‰0‹G @‰G ‹Æ_^][Ä É7‹G @‰G ‹Æ_^][Ä ÃSÿ FƒÄ_^]3À[Ä ËÿVÿӃċ÷…ÿu—_UÿÓƒÄ^[]ÃQV‹t$ …öWÆD$ „‹F …À„û‹|$WhôÏHè’MÿÿƒÄ…À„ç¡”FÆD$ ƒÀ ‰D$‹L$QhÈIÿF‹6ƒÄ…ö„SU‹F…À‰D$uÇD$õIŠF(»ìI„Àu»äI‹F …À‹èu½T IŠV¿ìI„Òu¿äI‹F…À‹Èu¹ÀI„Òt…Àt Џ¼I€ú.u¸õI‹T$R‹VR‹VRSUWQP‹D$8h¤IPÿ,F‹6ƒÄ(…ö…gÿÿÿ][ŠD$ „Àu‹L$QÿÜFƒÄ_3À^YÃh@ÒHWÿÐFƒÄ‰D$…À…ÿÿÿ_¸^YÃÿ%èFÌÌÌÌÌÌÌÌÌÌÿ%PF‹T$‹D$L$‰D$Qh~f€RÿFÃ싌$¸ÓMb÷éÁú‹ÂVÁèЋ´$‰T$‰´$’Ç„$‰t$ÇD$ €€Áâ+ÊT$ ‰L$QR€N€Áà‰D$„$PjQÿàFƒøÿu À^ÄÃ…Àu ¸^ÄÃT$ RVèñz÷ØÀ^ƒàÄðÃì,SUV‹t$‰|$ è‰D$$‹D$T‰T$(ÇD$à“Æ‹‡Œ…Àu‹‡…À„ˆ‹‹—QRèÕRPèî‰D$,‹‡ŒÛD$,ƒÄ…Àt‹…Ét ;Á|‰ë …Àu‹‡€€€Áà‰D$èÉú‹L$+ȉL$yh\IWèLÿÿƒÄ¸_^][ƒÄ,ˇ|…Àt ‹†Œ‰D$ë ‹Žl‰L$І¹$I„Àu¹õI„À¸ Iu¸õI‹T$HRQ‹L$ QPhüIWè'Kÿÿ‹T$\ƒÄ‹‹H ƒ9uhäIWè{KÿÿƒÄ¸_^][ƒÄ,ÃÎÿ3Û‰\$ÇD$ë‹|$ ‹T$D‹‹H ƒ<™„ÑjjjÿF‹èƒýÿ„v‹D$@‹‹Jh…ÉtUPèփąÀ…OjUèSýÿÿ‹L$L3À‰D$4ƒÄ‰D$0‰D$4‰D$8‹‹P ‹ š‹‹L$H‰T$0f‹@Qf‰D$0ÿÌFT$,jRUf‰D$:ÿüF‹ðƒþÿuTèéüÿÿƒø t)=2'~=4'~‹L$P‹D$ PQh¸IWè€JÿÿƒÄë!ƒ¿uÇD$‹T$RUèÏüÿÿƒÄ‹ðƒþu ƒ¿tnë…öuUèpýÿÿƒÄ„À…œƒÎÿUÿìFè–‹L$$‹ø‹D$(‹ÚPQSWè¡‹L$ ƒÄ+ȉL$xr‹T$‹L$BA‰\$(‰|$$…ö‰T$‰L$‹Ú…†þÿÿ‹D$P…Àt‹L$D‹‹J ‹™‰‹D$L…Àt‰(3À_^][ƒÄ,Ãh IWè©IÿÿƒÄ¸_^][ƒÄ,ËT$TÆ벋D$‹L$ @Ph€IQè{Iÿÿ‹\$ ‹|$,ƒÄ …ötŽ‹T$LhpIWÇÿÿÿÿèWIÿÿƒÄ¸_^][ƒÄ,Ãì(ƒÉÿ3ÀSUV‹´$8W‹.‹Uh‹úò®÷ÑIùÿƒ‰D$ õIˆD$8¹?3À|$9ó«‹ÔFRf«ªÿÓ‹UhƒÉÿ‹ú3Àò®÷ÑIƒùvOL$QPRVè‡ÿÿƒÄƒøuT$RV舊ÿÿƒÄ‹D$…Àt$‹}hƒÉÿ3ÀT$8ò®÷Ñ+ù‹Á‹÷‹úÁéó¥‹Èƒáó¤ŠD$8„À„†L$8QhlIUèýGÿÿƒÄ T$8RÿӋ؃ûÿ„N‹D$…À„;‹0PU裉ÿÿ3À|$ ‰D$ƒÄ‰D$‰D$j‰D$$‹V ¿N ‹2‹ÁÁéó¥‹Èƒá󤋴$DL$QVfÇD$ ‰\$$fÇD$"ÿF…À|HT$$D$(RPVÇD$0ÿF…À}hTIUèÀGÿÿƒÄ¸-_^][Ä(Ã_^]3À[Ä(Ë5øFÿÖ‹ƒø?t1ƒè t ƒètHuAÿÖ‹Qh$IëvÿÖ‹RhôIëjÿÖ‹PhÜIë^ÿÖ‹Qh¼IëRƒøt0ƒø&t=6't ÿÖ‹Rh°Ië5ÿÖ‹PhxIë)ÿÖ‹Qh`IëÿÖ‹RhLIëD$8PëL$8Qh(IUèúFÿÿƒÄ _^]¸-[Ä(Ãÿ%äFÌÌÌÌÌÌÌÌÌÌVÿÄF‹È¸ÓMb÷áÁê‹t$’‰€€Áà+ȉ€ €¸Áá‰N^ÃìD$jPè±ÿÿÿ‹D$‹T$ ƒÄËL$‹D$+ȸÓMbÁó÷é‹L$ Áú‹ÂÁèЋD$+Á€€ €ÊËD$ËD$ƒètÿøFÇ?'ƒÈÿËD$ ‹L$PQèƒÄÃìSU‹l$V3ÛW¾uE;ó‰\$|$ˆ\$tmVh´Fÿ˜FƒÄ…Àt43ÉŠ ‰Ñáé´FÈùÿwA…Ûˆu+‹D$@ƒø‰D$-»ëƒþ.u!…Ûtƒ|$tG3ÛÆ¾uE…öušƒ|$} _^]3À[ƒÄËD$ ‹L$_^‰]¸[ƒÄËT$‹B…Àu¸ËL$V¾W‹8Óæ…÷t‹pV‹t$VQRÿPƒÄ_3À^ËT$‹B…Àu¸ËL$V¾W‹8Óæ…÷t ‹pVQRÿP ƒÄ _3À^Ã줋„$¨S‹´FV‹´$´W‹8Љ|$ „Àt5‹ ¸Fƒ9~ ¾ÐjRÿÓƒÄë‹ °F¾À‹ŠBƒà…ÀtŠFF„ÀuËjVhÌIèCÿÿƒÄ …À„tUWƒÆè‹-ŒFƒÄë‹|$Š„Àt5‹ ¸Fƒ9~ ¾ÐjRÿÓƒÄë‹ °F¾À‹ŠBƒà…ÀtŠFF„ÀuËD$4L$PQh¸IVÿ¬FƒÄƒø…åT$h°IRèeBÿÿƒÄ…ÀtD$4PÿՃĉ‡Ð‚é†L$h¨IQè:BÿÿƒÄ…ÀtT$4RÿՃĉ‡Ô‚ë^D$h IPèBÿÿƒÄ…ÀtL$4QÿՃĉ‡Ø‚ë6T$h”IRèêAÿÿƒÄ…Àt D$4hˆIPèÔAÿÿƒÄ…Àt LJ܂|$ƒÉÿ3Àò®÷ÑI|$4‹ÑƒÉÿò®÷ÑIΊDt<,…ÀþÿÿFéºþÿÿ‹—Ђ3À…Ò]_•À^@[ĤÃ_^3À[ĤÃì|SUVW‹¼$‹7ƒ¾Ü‚u2‹†Ô‚‹ŽÐ‚‹—”P‹†Ø‚Q‹RPQh@Ièª<ÿÿƒÄë"‹—”‹†Ø‚‹RPQh4Iè†<ÿÿƒÄ‹ØT$SRèöqS‹ FÿÓD$PL$PQ辋”$¬‹„$¨RPh,IèD<ÿÿ‹èL$0UQè·qUÿÓT$LD$ƒÄ …À…‹|$$ƒìÇÛƒ˜Ý$Sè§éÿÿ‹Ž´WQjjjÿjÿVèqÃÿÿƒÄ(…À„Þ_^][ƒÄ ʃ^„À…ÈІƒÏÿ„ÀÆD$4‰|$,„1‹†„…À„#T$jRPƒÍÿÿìF‹L$$ƒÄ …É‹øtFŠ„Àt@‹¸Fƒ:~¾ÀjPÿ´F‹L$ ƒÄë¾Ð¡°F‹ŠPƒà…Àu€9-uA‰L$uºT$(jRQÿìF‹L$4‰D$(‹D$$ƒÄ ;Áu ÇD$ÿÿÿÿëƒ|$ÿu…ÿ|Wh€IS‰¾ˆèŒ&ÿÿƒÄ ëL…ÿ}#‹Ç‰¾ˆ÷؋艆¸Uh`ISèe&ÿÿƒÄ ë%‹l$‰¾ˆ+ïEPWh<IS‰†¸è>&ÿÿƒÄ‹L$UQWh ISè)&ÿÿ‹T$$‹|$@ƒÄ‹êÆ‚°ŠƒT„À…²‹… …À„¤ŠƒSPVèlƒÄ…À…K‹ƒÜ…ÀtPVè€ûÿÿƒÄ…À…/‹• L$,QRVèËL$8ƒÄ …Àu+‹“L…Òt;Ê~h\ISèÿ%ÿÿƒÄ¸?_^][ƒÄ Ëù‹–ˆ…Ò„ù…ÀthèISè`%ÿÿƒÄë=…Ò}‹Â÷Ø;È|‹ø+Ï‰Žˆë%;Ê}QRhÀISè¢%ÿÿƒÄ¸$_^][ƒÄ Ã+Ê‹ù…ÿu.WjÿWWjÿjÿVèûÀÿÿhœISè%ÿÿƒÄ$Æ…±3À_^][ƒÄ ˆˆPhpISèÚ$ÿÿ‹ŽˆQhhIVèHƒÄ…À…'T$D$ RVPè]ðÿÿƒÄ …À… |$^t"‹°QhPISèö$ÿÿƒÄ ¸_^][ƒÄ Ë• RhHIVèäƒÄ …ÀtU_^][ƒÄ ÃjVÆD$<èȃąÀ…§‹ƒô…ÀuŠƒT„À¸@Iu¸8IPh°ðHVè“ƒÄ …À…rD$L$ PVQè¨ïÿÿƒÄ …À…W‹D$=–tGƒø}tBŠL$4„Ét=Âu_Æ…±^]3À[ƒÄ Ó°Rh°ðHSè$ÿÿƒÄ ¸_^][ƒÄ ÊD$4ÇD$ÿÿÿÿ„À…—ŠƒS„À…‰ƒÿ€»¬h0IWÿäF‹èƒÄM…Àtm‹Å+ÇH‰D$4tDŠE<(t=‹ ¸Fƒ9~¾ÐjRÿ´FƒÄë‹ °F¾À‹ŠBƒà…Àt*‹D$4MH‰D$4u¼…ítEUÿôFƒÄ‰D$ë ƒÿÿ~‰|$ŠƒV„Àt‹†´PVSèOƒÄ …Àu2‹|$WhISè¸"ÿÿ‹L$0‹–´jjÿQjWRVè¾ÿÿƒÄ(…Àu3À_^][ƒÄ Ãì V‹´$0D$WPjL$,jVQR‰t$<ÇD$8ÇD$ ÇD$$ÿàFƒøÿ„…Àt|D$L$PQVÇD$ÿFT$D$RPVÿ$FV‹øÿìFƒÿÿu‹Œ$,h¬IQëQ‹”$,hˆIRè×!ÿÿ‹„$8jW‰¸´è‚ÔÿÿƒÄ3À_^Ä ËŒ$,h\IQë ‹”$,h4IRè"ÿÿƒÄ¸_^Ä ÃSŠ\$ V‹t$ W¸4ÕH‹>„Ûu¸ìÓHPhøIVèÙ ƒÄ …ÀuPD$L$PVQèòìÿÿƒÄ …Àu9|$Èt-„Û¸ðIu¸èIPhÐIWè‡!ÿÿƒÄ öÛÛ_ƒã ^ƒÃ‹Ã[Ã3À_^[ËD$VW‹|$ PhI‹7WƬèR ƒÄ …Àu>L$ T$QWRèkìÿÿƒÄ …Àu'|$ ÕuƒÆVÿôF‹L$ƒÄ‰_3À^ø _^Ãì S‹\$UV‹ƒ`‹³x3íW‹;UUWÆD$‰|$ ‰D$,ǃ(ÿÿÿÿèâÿÿUUWèîáÿÿUUWèFâÿÿUUWèþáÿÿj/Vÿ˜F‹øƒÄ8…ÿtm‹“x‹Î+Ê…É~ …íÆD$tÆD$‹×+Öt6‹D$%ÿ‹È+Î+ðÏQVè4ÿÿ‹T$(ƒÄ…À‰DªtvEwƒýc’ëwj/Vÿ˜F‹øƒÄ…ÿu“‹|$ ‰· Š„À„jVè³3ÿÿƒÄ‰‡ …À…Wèìôÿÿ‹L$h IQèÝÿÿƒÄ ¸_^][ƒÄ ËD$h IPè¾ÿÿ‹L$(Qè´ôÿÿƒÄ ¸_^][ƒÄ ËT$hIRè•ÿÿ‹D$(Pè‹ôÿÿƒÄ ¸_^][ƒÄ ÃLJ T$RSè–‹ðƒÄ…öutŠD$„Àt SèÿôÿÿƒÄ‹ð…öt‹ƒ´…À|PÿìFǃ´ÿÿÿÿЇ±„ÀtjjÿjjjÿjÿSèºÿÿƒÄ‹ð_^][ƒÄ ÊD$„Àu‹Æ_^ƃ][ƒÄ ÃWèãóÿÿƒÄ‹Æ_^][ƒÄ ÃQS‹\$ UV‹«`W‹;3ö‰l$‹‡Ô…ÀtPSèèóÿÿ‹ðƒÄ…ö…—Šƒý„Àt‹…¤…ÀtPSèð ‹ðƒÄ…ö…o‹ME…Ét(‹è‹PSèÎ ‹ðƒÄ…ö…M‹MƒÅ…É‹ÅuÞ‹l$ЇP„Àu‹‡ä…À„€‹… …ÀtvPSè(‹ðƒÄ…öt ƒþ…‹—ä…ÒtS‹ü‚…É~;‹‡è…À~1ƒêt ;È}6hðIë ;È~+hÄIWèYÿÿƒÄÆ…±3À_^][YÃhèIWè<ÿÿƒÄЇ^„À„9Š[„É„‹ …É„ Æ…±ŠSQSè{ûÿÿƒÄ…À…^‹… T$RPSèîûÿÿƒÄ …Àu,‹L$·¬QhÐIVèÿÿjVjWèÆÿÿƒÄ…À…jhÈISè ƒÄ …À…T$D$RSPè3èÿÿƒÄ …Àu$|$^ujh°IjWèsÿÿƒÄ…À…ÆŠ‡P„ÀtA‹ü‚‡ü‚…É|1PÿFPh„I·¬hÿ?Vÿ<FjVjWè$ÿÿƒÄ$…Àu{_^]3À[YÄÀt‹Æ_Æ…±^][YʇV„Àt,Sè‚‹ðƒÄ…öuEhTIWèÎÿÿ‹L$$ƒÄ‹Æ_^]Æ[YËl$USè‹ðƒÄ…öu€}th,IWè—ÿÿƒÄ‹Æ_^][YËD$ƒìSVW‹|$,Ph| I‹7WƬèÞƒÄ …À…èL$,T$$QWRèóæÿÿ‹ØƒÄ …Û…É‹D$,=Õt>=&t‹h\ IPèÿÿƒÄ‹Ã_^[ƒÄËh@ IQènÿÿƒÄ»‹Ã_^[ƒÄÃT$0D$ RL$PT$QD$$RL$,PQVh$ IRÿ¬FƒÄ ƒøuKjÿÌF‹L$‹T$‰D$$‹D$4P‹D$Q‹L$$R‹T$,PQRh IVèÃÿÿD$DPVè(Aÿÿ‹ƒÄ,‰ü‚‹Ã_^[ƒÄÃì4 õISUVWˆD$D‹¬$H¹?3À|$Eó«‹]3Òf«‰T$ˆT$ª‹Cd…ÀtpPÿÔF‹SdƒÉÿ‹ú3Àò®÷ÑIƒù~#L$QPRUèºXÿÿƒÄƒøuT$RUè'\ÿÿƒÄ‹T$…Òt*‹{dƒÉÿ3Àt$Dò®÷Ñ+ù‰t$‹Á‹÷‹|$Áéó¥‹Èƒáó¤ŠD$D„Àu6‹…°L$T$,QRPÇD$$ÿF…À} hTIé'‹T$ÆD$…ÒtRSè9[ÿÿ‹D$ƒÄ…Àu+ŠD$„Àu#L$DQh(ISè¶ÿÿƒÄ ¸_^][Ä4ÃjjjÿF‹è3Ò;êŒÀ‹„$H‰¨´ŠD$„Àu>‹D$3ɉL$,|$0‰L$0‰L$4‰L$8‹¿H ‹@ ‹0‹ÁÁéó¥‹Èƒáó¤fÇD$,‰T$0L$,jQUf‰T$:ÿF…ÀŒKT$D$RPUÇD$$ÿF…À} hTIé0‹L$QÿôFjU‹ðÿF…À} h饋D$T$,Rj‹H‹PQ‹HR‹PQRWÿT$DƒÄ…ÀtPÿÕPh#IVèä ÿÿƒÄÇD$'éS‹D$,PWÿT$8‹èƒÄ…í‰l$„8ë‹l$‹\$4UWÿÓjhø"I‹ØjV‰\$@è6 ÿÿjSjVè+ ÿÿjhŒÏHjVè ÿÿL$PQUWÿT$|‹ØƒÄD…Û„œSUWÿT$HƒÄ ‰D$0…Àtmƒ8th‹è‹øjhôIjVèÚ ÿÿjSjVèÏ ÿÿjhô"IjVèÀ ÿÿ‹UjRjVè² ÿÿƒÄ@jhŒÏHjVè  ÿÿ‹GƒÇƒÄ‹ï…Àu¨‹l$‹|$@‹D$0PÿT$H‹D$PUWÿT$X‹ØƒÄ…Û…dÿÿÿjhŒÏHjVèY ÿÿS‹\$`ÿÓ‹L$u¾ä$I…ít€}t UÿôFƒÄ‹“°WVh¸$ISRèùÿÿƒÄéËj:W‹=˜Fÿ׃ĉD$…ÀtS@j:P‰D$ÿ׋ðƒÄ…öt+ÆFj:Vÿ׋èƒÄ…ítÆEEj:Uÿ׋øƒÄ…ÿt ÆGë‹|$‹D$…Àt ‹Ð€:uë‹|$‹D$hè$IPèåÿÿƒÄ…öt€>u¾ä$I…ít€}u½¼I…ÿt€?t WÿôFƒÄ‹L$‹“°QUVhŒ$ISRè)ÿÿƒÄ‹ð…öt‹D$h%IPèÿÿƒÄégþÿÿ‹‹°jƒ|jÿPjjÿQéAþÿÿ_^]3À[ƒÄÃV‹t$‹†`‹ˆ¨Qè™ÿÿ‹–`Rÿ FƒÄdž`3À^ÃìHSUV‹t$XWV‹¾°‹.‰|$ŬèƒÄ…À…w‹ž`VèփąÀ…`ÿ(Fjö‰D$ÿtF‰D$‰D$$‹D$j!PW‰D$4ÿøFƒøÿu_^]3À[ƒÄHË|$jÿD$(jPjÿHFƒètzHuç‹T$L$,QRWÿFƒøÿtÑöD$,tND$Phÿ?UWVè„ÿÿ‹L$$QUVè‹”FƒÂ RÿÄF‹ƒÄ$…Àt‹C…ÀuVè"ƒÄÇCöD$, uépÿÿÿ‹L$D$jPhÿUQ‹ýÿLF…Àt\‹D$‹ÐH…Ò‰D$„;ÿÿÿŠG€ùÿˆL$\¸u ˆL$]¸L$ T$\QP‹†°RPVèùÿÿ‹D$$ƒÄ‹ÈH…ɉD$u¼éòþÿÿjjÿjjjÿjÿVèðŸÿÿƒÄ3À_^][ƒÄHÃh¸ÿ¤F‹ÐƒÄ…Òu¸ËD$W¹®‹ú‰`3À󫉂´¸Ь‰‚‰‚‰‚‰‚‰Š¬3À_ÃS‹\$VW‹ƒ`3ö¸ƒ¿ôÿÿu jVSè)ƒÄ ƒ?u jVSèƒÄ FƒÇƒþ(|Ñ_^[ËL$ V‹t$ƒù‹L$ ‹†`‹”ˆ uAƒêt ƒêt@Jun‹”ˆ…ÒucÇ„ˆ^ÃQhýVÇ„ˆ èEƒÄ ^ÃJtJtÆJu1‹”ˆJu'Ç„ˆ^ÃQhþVÇ„ˆ è ƒÄ ^ÃQŠD$S‹\$V‹t$jL$ j‹–°QRÆD$ÿˆ\$ˆD$ÿèF‹D$‹PShh(IQè ƒÄ^[YÃV‹t$Іh„À„ö‹L$ùÿuB‹D$=ìr!;Áw‹…\"I‹L$ PQh¨(IVèúÿÿƒÄ^ËT$ PRhœ(IVèäÿÿƒÄ^Ãùûu¸t&Ië/ùüu¸l&Ië ùýu¸h&Ië3Àùþ•ÀH%`&I‹T$…ÀtMƒú' ‹ •l%Ië úÿu ¹”(I…ÉtQP‹D$Phˆ(IVèhÿÿƒÄ^ËL$ RPQh|(IVèQÿÿƒÄ^ËD$ RQPhp(IVè:ÿÿƒÄ^ËL$ V‹t$ƒù‹L$ ‹†`‹Tˆu>ƒêt ƒêt=Juh‹”ˆ…Òu]Ç„ˆ^ÃQhûVÇDˆèKþÿÿƒÄ ^ÃJtJtÉJu.‹”ˆJu$Ç„ˆ^ÃQhüVÇDˆèþÿÿƒÄ ^Ãì„‹„$ˆSUVŠˆ‹°`W‹8„ɉ|$»tA‹€Œ$”Ph)IhQèÆúþÿ‹†¨”$¤RPè‚ÿþÿƒÄ‰†¨‰ž¤‹¿à…ÿ„ø‹-0F‹Œ$”T$QRh)IPÿ¬FƒÄƒø… L$hü(IQèéþþÿƒÄ…Àt(”$”j†RPÿÕƒÄ Æ†'‰žhé‚L$hô&IQè«þþÿƒÄ…Àt%”$”j†(RPÿÕƒÄ Æ†§‰ž”ëGL$hô(IQèpþþÿƒÄ…ÀtY”$”RÿŒFƒÄ…Àt4P‹†¨Pè‡þþÿƒÄ‰†¨‰ž¤‹…ÿ…ÿÿÿ_^]3À[Ä„Ã_^]¸[ĄˋT$QhØ(IRè^ÿþÿƒÄ ¸0_^][ĄˋL$Ph´(IQè9ÿþÿƒÄ ¸1_^][Ä„ËD$ U‹l$‹ÈVH‹µ`W‹}…É„5‹T$@S‰D$3Ûë‹T$Š BˆL$‹†´ƒø‰T$‡ùÿ$…—A‰ž´ŠD$:ÄàT$jRjWèMÿÿƒÄéÉ€ùÿudž´éµ€ù u dž´D$jPjWèÿÿƒÄé‹L$áÿQhûhD)IWè ûÿÿÇ‹T$$âÿRU蹃ÄéO‹D$%ÿPhühD)IWègûÿÿÇ‹L$$áÿQUèPƒÄé‹T$âÿRhýhD)IWè-ûÿÿÇ‹D$$%ÿPUè·ƒÄéÝ‹L$áÿQhþhD)IWèôúÿÿÇ‹T$$âÿRUè=ƒÄ飀ùÿudž´é•‹–¬†¬;Ѓˆ ‹A‰éu€ùð„$€ùÿ†¬„û‹;Ðs Æÿ‹A‰ŠL$‹;Ðsˆ ‹A‰‹–¬ƒé‰‰Ž°‹D$%ÿPhÿh$)IWè=úÿÿUè'ƒÄdž´‹D$%ÿˆÿÿÿƒùwrÿ$<—Adž´éÔdž´éÅdž´é¶Ç†´é§Ž¬dž´‰Ž¬éŒT$jRjWèùþþÿƒÄërPhÿhD)IWè“ùÿÿƒÄë\‹;ÈsÆÿ‹A‰dž´ëH‹Ž¬†¬;ÈsÆÿ‹A‰‹;ÈsÆð‹A‰‹–¬ƒéU‰Ž°‰è%ƒÄ‰ž´‹D$H‰D$…Úüÿÿ[_^]Ã;”A–Au”A¯”Aè”A!•A”A[•A•A]–A!–A0–A?–AN–Ax–A‹D$V‹t$‹Ž`‹” ƒêtƒêt7Juh‹”ƒêtJuYÇ„ Ç„^ÃÇ„ ^Ë”ƒêt*Ju%Ç„ Ç„PhþVèø÷ÿÿƒÄ ^ÃÇ„ ^ÃW‹¼º;ú_uÐPhýV‰” èÁ÷ÿÿƒÄ ^ËD$V‹t$W‹Ž`‹” JteJt7Juy‹”3ÿ+×tHJuiPhýÇ„ V‰¼èb÷ÿÿƒÄ _^Ë”3ÿ+×tJu5‰¼ ‰¼_^ɼ _^ÃPhþVÇ„ è÷ÿÿƒÄ _^ËD$V‹t$‹Ž`‹Tƒêtsƒêt1Ju_‹”ƒêtJuPÇDÇ„^ÃÇD^Ë”ƒêt'Ju"ÇDÇ„PhüVè”öÿÿƒÄ ^ÃÇD^ÃW‹¼º;ú_uÓPhûV‰TècöÿÿƒÄ ^ËD$V‹t$W‹Ž`‹TJt\Jt4Jum‹”3ÿ+×tBJu]PhûÇDV‰¼èöÿÿƒÄ _^Ë”3ÿ+×tJu,‰|‰¼_^É|_^ÃPhüVÇDèÉõÿÿƒÄ _^Ãì SU‹¬$ VW‹½`‹]‰\$‹‡°‹·¬+ƬƒÀPQjòþÿ‹Ÿ¨ƒÄ…Û¾th‹ƒÉÿ‹ú3Àò®÷Ñ<1ÿú}ID$Œ$”PQhp)IRÿ¬FT$$„$¤Rj¹Pj+Îhd)I”48QRèÐñþÿƒÄ,‹÷‹[…Ûu˜¸hðhÿ+Æh\)IŒ4 PQè ñþÿ‹…°ƒÄƒÆ”$jVRPÿèF‹T$ƒÆþŒ$VQj>Rè ƒÄ_^][Ä ×(ƒÉÿ‹ú3Àò®hðhÿRP÷Ñj#húIhÿhL)I„$4‹ñhPƒÆèñþÿ‹•°ƒÄ(Œ$jVQRÿèFƒÆþ„$VPëm—ƒÉÿ‹ú3Àò®hðhÿ÷ÑRPIjhú‹ñhÿhL)IŒ$4hQƒÆè§ðþÿ‹…°ƒÄ(”$jVRPÿèFƒÆþŒ$VQj>SèƒÄ_^][Ä ÃSUV‹t$3ÛWІh„À„{‹D$‹l$…À„úƒø<¸D)It¸h(IPh*IVèõþÿ‹D$,ƒÄ ƒøŒÆ3Û3ÉŠ\(þŠL(ÿûÿ‹ùu ÿð„¤h*IVè`õþÿƒÄƒû'‹l%IRhŒÑHë%ûìrûÿw‹\"IPhŒÑHëSh*IVèõþÿƒÄ ƒÿ'‹ ½l%IQh°ðHë%ÿìrÿÿw‹½\"IRh°ðHëWh˜ÊHVèÜôþÿƒÄ hô)IVèÎôþÿ‹D$(ƒÄƒè‰D$ ë‹D$ ƒø}hà)IVèªôþÿƒÄ_^][ÊE<'w4<t<#t<'t%ÿ‹…l%IPhÌ)Ië%ÿ‹ …l%IQh°ðHë 3ÒŠ+Rh¼)IVèVôþÿ3ÀƒÄ ŠEƒøw*ÿ$…(ŸAh¸)Iëh°)Ië h¤)Iëhœ)IVè"ôþÿƒÄŠE<„–<#„Ž<'t,‹\$ ¿;ߎ”3ÀŠ/Ph”)IVèæóþÿƒÄ G;û|çëyŠE„ÀurhÈðHVèÊóþÿ‹\$(¿ƒÄ;ß~W3ÀŠ/‹ÈƒétItPh ïHVèŸóþÿƒÄ ëh)Iëh´ IVèˆóþÿƒÄG;û|Æë‹L$ ƒÅUhˆ)IÆD)þVèfóþÿƒÄ ‹D$…ÀthŒÏHVèPóþÿƒÄ_^][Ã.žA5žA<žACžAVW‹|$ ‹7‹†è‚…Àtt¨t džä‚ë:¨t džä‚ë*¨t džä‚ë¨t džä‚ë dž䂋†ä‚…Àt‹†tPÿŒFƒÄ‰‡\džè‚_^ÃSU‹l$V‹t$W3Û‹>ˆ]‹‡à‚…Àu3Іÿ„ÀtІ„Àth—ëІ„Àt@h‘Wèó ƒÄЇ¸‚„Àt3‹‡¼‚…Àt)‹ŽlQPè?ñþÿƒÄ…ÀuЇZ„Àu _ÆE^]3À[Ã¿à‚—…‹‡ä‚ƒøuUjV»dÑHèŠ#ƒÄ …ÀtN_^][ÃøuDІ„Àt:hˆ*IWèƒÄ…Àu(V»€*IèâƒÄ…À…æh‘WÆEè8 ƒÄ‹†˜…Àu¸õIPSh\*IWèyñþÿƒÄ¿à‚‘…£‹‡ä‚ƒøuUjV»dÑHèí"ƒÄ …Àti_^][Ãøu(‹Ð‚…Ét‹T$‹D$RPV»ÌIèÍ®ÿÿƒÄ …ÀuUë3ƒøuLІ„ÀtBhL*IWèJƒÄ…Àu0V»€*I舃Ä…Àu ÆE…Ût‹ŽQSh$*IWèÆðþÿƒÄ3À_^][ÃS‹\$ VW‹ûƒÉÿ3Àò®‹D$÷Ñ‹°¬I…ö‹ùt‹WSQè³ïþÿƒÄ …Àu ‹v…öuè_^3À[Ë_^[ÃSV‹t$ W‹‹Ž˜¬‹†”PQh,ISèxìþÿ‹ûƒÉÿ3ÀT$ ò®÷ÑIRQSè€(ƒÄ…À|;‹†D‹= F…ÀtPÿ׃Ä‹D$Ph *Iè”êþÿ‹L$‰†DQÿ×ƒÄ 3À_^[Ã_^¸[ÃS‹\$VW‹‹‹˜°¬‹ƒœPQh,IVèèëþÿ‹þƒÉÿ3ÀT$ ò®÷ÑIRQVèð'ƒÄ…À|5‹ƒ8Pè4ÿÿ‹L$Qh¼*Ièêþÿ‹T$‰ƒ8Rÿ FƒÄ3À_^[Ã_^¸[ËD$SU‹l$ V=—‹uWu!‹D$žƒx‹†à‚=—t5h—ë%‹L$=‘ž ƒyu¾à‚‘th‘Vè~ƒÄŠ„Àt?‹-´F‹¸Fƒ:~ ¾ÀjPÿÕƒÄë‹°F¾È‹ŠHƒà…ÀtŠGG„ÀuË‹l$jWhdÑHè¹íþÿƒÄ …Àth‹ƒÊ‰‹†ä‚ƒøu9‹D$W=—”ÁQUèÌƒÄ ƒøtn‹–tRÿŒFƒÄ‰…\3À_^][è„‹†è‚_ ‰†è‚^]3À[ÃjWhÌIè=íþÿƒÄ …À„ˆ‹ƒÊ‰‹†ä‚ƒøuO‹†Ð‚…ÀthÜ*IVèÛíþÿƒÄ3À_^][ÃWUèz©ÿÿƒÄƒø…¥‹†tPÿŒFƒÄ‰…\3À_^][è„€WUèB©ÿÿ‹†è‚ƒÄ ‰†è‚_^]3À[ÃjWh€*IèìþÿƒÄ …ÀtM‹ƒÊ‰‹†ä‚ƒøu)|$‘uhÜ*IVdžè‚è5íþÿƒÄ3À_^][èt‹†è‚ ‰†è‚_^]3À[ËT$SUVW‹úƒÉÿ3Àò®‹|$÷ÑI‹ñVRWèìþÿƒÄ …À„˜Š>÷„Àt;‹=´F‹ ¸Fƒ9~ ¾ÐjRÿ׃Äë‹ °F¾À‹ŠBƒà…ÀtŠFF„ÀuË‹=˜Fj Vÿ׃Ä…Àuj Vÿ׃Ä…ÀuPVÿ׃Ä‹l$+Ƌ؋ýƒÉÿ3Àò®÷ÑI‹ù;ßrWUVèˆëþÿƒÄ …Àu KF;ßsë_^]2À[Ã_^]°[Ãì<‹Œ$L‹”$HSUVW‹¼$PQR3Û‹h ,IP‰\$,‰\$H‰D$$‰\$0èðëþÿƒÄ‹‡\;ÃtPÿ FƒÄ‰Ÿ\‹„$\‹Œ$XPQhLIèYæþÿ‹èƒÄ ;ë„\T$+RUh,IWèûøÿÿ‹ðƒÄ;óum‹D$9XTt‹<ë¹õIЇ„Àt‹‡8ë¸õI‹”$XQ‹Œ$`P‹„$\QRhø+IWPè@ìþÿ‹ðƒÄ;ót‹L$hØ+IQè˜ëþÿƒÄUÿ FƒÄ;ó…Ó‹D$‹”$T¹At$D¼$H¨¬‰T$HÇD$Dó¥‰l$0‰\$$ÆD$ŠD$„À„2‹D$ …À…ª¹A´$H|$DÇD$<ó¥‹|$ÇD$@‹‡Œ…ÀtG‹„$P‹ˆ¤‹ QRèU¤ÿÿRPèn¤ÿÿ‹È¸ÓMb÷鋌ƒÄÁú‹ÂÁèÐ+Ê…ÉŽÚ‹´$TT$„Àt5öFu ЇQ„Àt%‹Žl‹–°3Àf‹†tPQRVèPûÿÿƒÄ…ÀuSöFt Vè­ÿÿƒÄ…Àu@І„Àt4Ї¸‚„Àu*‹‡¼‚…Àt Pÿ FƒÄ‹†lPÿŒFƒÄ‰‡¼‚3À_^ÃUVW‹|$‹/‹·`…ö‹Et‰l$‰‡‹M ‰„‚S‹^\…Ût‹‹- FRÿÕSÿÕ‹l$ƒÄÇF\‹…ðƒøu‹F‹^ɇ|‹QèôþÿƒÄëƒøu‹V‹FЉ—|‹‡€‹NÁ[uhH,IUèíæþÿƒÄ¸4_^]Ã_^3À]ËL$ù‘u ‹D$‹P8ëù—u‹D$‹P<‰ä‚‰ˆà‚Ç€è‚Ãì<SU‹¬$HVWÇD$$‹…x‹]‹d‰D$(‹…`‰\$…À‰L$ÇD$,õIÆD$u8j`ÿ¤F‹ÐƒÄ…Ò‰T$u_^]¸[Ä<ù3À‹ú󫉕`ë‰D$ŠEÆ…ü¨tŠƒ`„Àt ǃð‹ƒô…Àt‹ðë9Šƒ^„Àt¾øIë(‹ƒðƒøtƒøtƒøu¾°/Ië ¾ôI뾨/Ihœ/IS‰t$(èqôÿÿƒÄ…Àt‹…<3ÿ;ÇtPÿ FƒÄ‰½<ë3ÿ‹D$(T$RPVUèIòÿÿƒÄ;Ç…Æ ‹LQèò)ÿÿ‹ƒ„ƒÄ;Çt.h/ISè ôÿÿƒÄ…Àu‹“„Rh€/IèBßþÿƒÄ‰…L뉽L‹…PPè¥)ÿÿ‹ƒ¨ƒÄ;Çt.hx/ISè½óÿÿƒÄ…Àu‹‹¨Qhh/IèõÞþÿƒÄ‰…P뉽PŠ…„ÀuCƒ»ðt0h ISèvóÿÿƒÄ;Çth´Ih IPèÿöÿÿƒÄ „ÀtÆ…Š…„Àt"h ISè<óÿÿƒÄÇD$,H/I…ÀtÇD$,õI‹T$h@/IRèóÿÿ‹´FƒÄ…À„–pŠ@„Àt5‹ ¸Fƒ9~ ¾ÐjRÿÓƒÄë‹ °F¾À‹ŠBƒà…ÀtŠFF„ÀuËŠ‹þ„À„ƒ¡¸Fƒ8~ ¾jQÿÓƒÄë¡°F¾‹ŠQƒà…Àu €?:tŠGG„ÀuÈ;þtG+þ‹ßSRÿ¤FƒÄ‰…X…Àu_^]¸[Ä<Ëˋø‹ÁÁéó¥‹Èƒáó¤‹XÆ‹t$‹†…ÀtFjjVèÿÿÿ‹…XƒÄ …Àu‹D$‹U‹L$(Áê€âR‹–QPRè2’ÿÿjV‰D$<èžÿÿƒÄŠ…ÿ„ÀtІQ„ÀuöEu ‹†t‰D$(‹†ð‹t$ƒø…‹\$NQ‹“°RVèWðþÿ‹øƒÄ …ÿ„êh /ISèŸâþÿƒÄ‹Ç_^][Ä<Ë…T…Àt Pÿ FƒÄ‹Eƒàt f½t»t…ÀuBfƒ½tPu8Š…¹$I„Àu¹õI„À¸ Iu¸õI‹T$QRPh/IèWÜþÿƒÄë@Š…¹$I„Àu¹õI„À¸ Iu¸õI3Òf‹•tRQ‹L$$QPhü.IèÜþÿƒÄ…À‰…T…}þÿÿ_^]¸[Ä<Ë\$hô.ISè•ðÿÿƒÄ…ÀuÇF à.IhØ.ISè|ðÿÿƒÄ…ÀuÇF”.I‹ƒðƒøtƒøt ƒø…º‹…ˆ…À„¬} Ç…ˆ‹µˆ…ö„’‹\$3ÿ+÷þ@~¾@‹C PVƒ¬jPÿStƒÄø;Æu ‹µˆ;þt!ëËWhìISèáþÿƒÄ ¸_^][Ä<˃˜…À~.+…ˆ…À‰ƒ˜hp.ISèÎàþÿƒÄ¸_^][Ä<Ê…„À„»‹\$¾9³ðuJhh.ISèqïÿÿƒÄ…Àu0‹…H…Àt Pÿ FƒÄ‹„QhT.Iè•ÚþÿƒÄ‰…Hël9³ðtdhLISè'ïÿÿƒÄ…ÀuR‹ˆ‹ƒ˜…Ét!‹•„ÁPHPRh0.IèJÚþÿƒÄ‰…Hë!‹„PQh.Iè-ÚþÿƒÄ ‰…Hë‹\$‹ƒøÇD$< .IƒøtÇD$<.I‹“¬‰T$è…À‰D$u_^]¸[Ä<˃„…Àt‹…L…Àt ‰D$0¿õIë ¿õI‰|$0‹CX…Àt€8t‹…@…À‰D$Du‰|$D‹L$‹A…À‰D$8u‰|$8‹A …À‰D$Hu‰|$H‹…T…À‰D$@u‰|$@‹…P…À‰D$4u‰|$4‹CT…Àt€8t ‹µ<…öu‹÷Š…„Àt ‹•H…Òu‹×‹D…Éu‹ÏŠ…ÿ„Àt ‹…8…Àu‹Ç‹|$,W‹|$4W‹|$LW‹|$DW‹|$XW‹|$TW‹|$LWV‹|$0R‹T$DQ‹L$PP‹D$hPQRhà-IWè;ƒÄ@…À…ø‹t$$…ötw3ÿ‰t$$‹F…Àt;…ÿ…ª‹D$hÔ-IPèƒÄ¸õI‹N‹VQRP‹D$hÌ-IPèäƒÄG‹6…öu¸…ÿt‹L$jhTóHQè5ƒÄ ‹T$$RèŽÿÿ‹|$ƒÄ‹ƒä…Àt^ƒèPÿFPh°-I³¬hÿ?Vÿ<F‹ƒäƒÄƒètHVth˜-I블-Iécÿÿÿh€-IëVhd-IWèLƒÄ ‹D$…À„†‹L$j:‹Rÿ˜F‹ðƒÄ…öt[ŠFF„Àt9‹ ¸Fƒ9~¾ÐjRÿ´FƒÄë‹ °F¾À‹ŠBƒà…ÀtŠFF„ÀuÇ€>t‹D$‹Qh\-IWèÍƒÄ ‹T$‹B…À‰D$…zÿÿÿ‹D$jjSÇ@è’žÿÿŠD$'ƒÄ „À¸t‹ƒðƒè„H„HtujhTóHWèÜ‹•°‹ƒQURWè‹ðƒÄ…öth@-ISè“ÜþÿƒÄéð‹T$‹B…ÀtJë3É…Àt‹…°ëƒÈÿQƒÂP‹…°RjjÿP鮋ƒ˜…À~Š„ÉuPhÐIWèäƒÄ hTóHWèÖÛƒ˜Ý$Sè·ÿÿ‹•°‹ƒQURWèr‹ðƒÄ…öth$-ISèîÛþÿƒÄéK‹L$‹…°QƒÁRPQjjÿPé#‹D$p‹PVè)íþÿƒÄ…Àth-ISè§ÛþÿƒÄ¸"_^][Ä<ËL$Ç…p¤@‰µÇAXŠ…„Àu‹Ñ‹BPhÐIWèƒÄ h-ISè0êÿÿƒÄ…Àuhè,IWèîƒÄƃlhHISè êÿÿƒÄ…ÀuGVjL$ThQèPíþÿƒÄƒøÿuhÀ,ISèýÚþÿƒÄ¸"_^][Ä<ÃT$LPRWèþƒÄ jhTóHWèî‹D$ ƒÄÛ@Ý$Sè[œÿÿ‹•°‹ƒQURWè‹ðƒÄ…öth$-ISè’ÚþÿƒÄë#‹L$‹…°QƒÁRPQjjÿPUèïuÿÿƒÄ‹ð…ö„Ø‹D$‹QèFçþÿƒÄ‹Æ_^][Ä<Ës`…öu‹{\…ÿtƒÉÿ3Àò®÷ÑI‹ñë3öŠ…„Àu%hlISèóèÿÿƒÄ…Àu‹T$VhÐIRè¬ƒÄ hHISèÎèÿÿƒÄ…Àu‹D$hŒ,IP舃ċL$jhTóHQèä‹C\ƒÄ …À„’þsRŠV„Éu‹T$PR踋|$ ƒÄ 醋|$hŒIWè-‹C\VPWè’jh„,IWè…‹|$8ƒÄ$ëV‹|$ƒì‰w‹K\‰OÇGXÇ…pºA‰­ÛGÝ$SèÉšÿÿƒÄ ëÛƒ˜ƒìÝ$S貚ÿÿ‹|$ ƒÄ G‰‹…°‹L$“ƒRUPQè]‹ðƒÄ…öth`,ISèÙØþÿƒÄë9‹G…ÀtOë3É…Àt‹…°ëƒÈÿ‹•°QƒÇPWjjÿRUè tÿÿƒÄ‹ð…öt ‹Æ_^][Ä<Ã3À_^][Ä<ËD$SU‹l$¯D$‹•`3ÛVW9Zu_^]3À[ÃzX”Áˆ‹J;ÈQ‹r‹|$‹ÁÁéó¥‹Èƒáó¤‹JT‹B;Ët*‹rP‰J‹JH‰r‰‹JL‰‹JX_A^‰ZT]‰JX[Ã_^‰Z][Ër‹|$‹È‹ÙÁéó¥‹Ëƒáó¤‹r‹Jð_‰r+È^]‰J[Ãj ÿ¤FƒÄ…Àt ‹Ð3ɉ ‰J‰JÃ3ÀÃìSU‹l$V‹t$WŠE‹`‹‹~¨‰T$$‰|$tCÿ@¸@‹Ç‹}‹È‹ò‹ÑÇ­BÁéó¥‹Êƒáó¤‹M‹t$‹|$Á­B‰L$$‹Ñë‹ÇL$QPR‹T$,RUèpØþÿƒÄ‰D$…À…‰‹EŠˆh„Ét‹L$‹T$$QRjPè2ÛþÿƒÄ‹D$(‹L$‹Ñ;ωtN‹+ùÁ‹‰KH‹•‹K‰SL‹S‰KP‰STÇ…pºA‰­‰{‰s\_^‰CÇCX]3À[ƒÄÃÇCX‹‹= F…ÀtPÿ׃ÄVÿ׋D$ ƒÄ_^][ƒÄËL$SUD$VPQè~Ñþÿ‹\$‹- F‹ðƒÄ…öt(W‹þƒÉÿ3Àò®÷ÑIQVSè6V‹øÿՃąÿ_u^]3À[Ë…ÀtPÿÕƒÄSÿՃĸ^][ÃS‹\$U‹l$‹V…Àt ‹K‹SÍJ;Êv3‹sõÑæ…ÀVt Pÿ¨FƒÄë ÿ¤FƒÄ…Àu ^]¸[ɉs‹‹t$W‹{‹Íø‹ÁÁéó¥‹Èƒáó¤‹C_Å^‰C]3À[ÃSUV‹t$W‹|$…ÿu‹>Š‹\$‹-˜F„Àt¾ÀPSÿՃąÀtŠGG„Àuê€?tÎþÿƒÄ …À„”ŠFƒÆ„Àt5‹ ¸Fƒ9~ ¾ÐjRÿ׃Äë‹ °F¾À‹ŠBƒà…ÀtŠFF„ÀuË€>t6D$ PVèԃăø0Ç|7‹L$$‹T$(‰K_‰S^¸[ÄÃ;|_^¸[ÄÃÇ_^¸[ÄÃìDSUVºõIW‹úƒÉÿ3Àò®÷ÑI‹ú‹ñƒÉÿò®‰D$‹„$`÷ÑIÆŠ„$\‹Ù„À‹„$X‰T$(‰\$$t%‹¸˜‹ˆœ¨8‰l$‰L$‰D$ ë'‹¸ˆD‰L$‹ˆ”‹l$‰L$‰D$ …ÿu‹ú‹D$…Àu‰T$‹T$ ‹ƒè„H„çhõIhõI‹Ëj‹ÓjÁùjâÿj QC RQ‹ÈR‹þj‹îÁùj%ÿÁÿQåÿPWUWUjjjjjjjjhœ0I”$ÀhRè­Çþÿ„$ˆL3 P”$ÌQRèsÄ€…ÀŽü‹t$‹PèÿÿŠ„$`ƒÄ„À¸”0Iu¸õI‹L$QPhx0IèqÇþÿ‹T$ ‰Rÿ FƒÄ3À_^][ÄDËE…ÀtPÿ FƒÄÇE‹„$`_^]Æ3À[ÄD˘Fj\WÿӃąÀuj/WÿӃĉD$…Àt‹ð‰|$(+÷@‰D$ë‰|$‹Ç‹øƒÉÿ3À‹T$ ò®‹D$ƒÂ÷ÑI‹éL$ët%h·h`Fjjÿh  Jèº\ƒÄ…ÀÇ^øè&p¡” J…Àu?hh`Fjj èz[¡” JƒÄ…Àu Ç” JFh!h`Fjj èQ[ƒÄ¡” JjÿPƒÄ‰D$…ÀuYÃVhÑh`Fjjè#[‹L$‹T$QRèôehÓh`Fjj‹ðèÿZ‹ ” JD$,PÿQƒÄ,‹Æ^Yøèfo¡” J…Àu?hh`Fjj èºZ¡” JƒÄ…Àu Ç” JFh!h`Fjj è‘ZƒÄ¡” JjÿPƒÄ‰D$…ÀuYÃVhãh`Fjj ècZ‹L$‹T$QRè¤bhåh`Fjj ‹ðè?Z‹ ” JD$,PÿQƒÄ,‹Æ^Yøè¦n¡” J…Àu?hh`Fjj èúY¡” JƒÄ…Àu Ç” JFh!h`Fjj èÑYƒÄ¡” JUjÿPƒÄ‰D$…À„Ähõh`Fjj è¡Y‹L$‹T$QRèRc‹è¡  JƒÄƒøu.¡œ J…Àt%PèfƒÄ…Àu¡œ JPèbaƒÄÇœ Jhþh`Fjj èBY‹” JL$QÿRƒÄ…ít=VWuD¿‹…ÀtöF@tP衃ÄÇÇF@ƒÆOuØUè…ƒÄ_^]YÃVh h`Fjj èÌX¡p3Ih ‹ðh`F@jj £p3Iè¬XƒÄ ‹Æ^á” J…Àu?hh`Fjj è„X¡” JƒÄ…Àu Ç” JFh!h`Fjj è[XƒÄ¡01IV…À¾01It‰¡” JVÿP ‹FƒÆƒÄ…Àuè¡X2I¾X2I…Àt‹ ” JV‰ÿQ ‹FƒÆƒÄ…Àuç¡ø1I¾ø1I…Àt‹” J V‰ÿR ‹FƒÆƒÄ…Àuâ¡t3I…À„‘SUWh(h`Fjj è»W‹0FƒÄ½¿´ûI¾löI‹‰nü…Àu(Uÿ@FƒÄ…Àtj PWÿÓÆGƒÄ ‰>ƒ>uÇÀIƒÆEƒÇ þ\úI~ÀhCh`Fjj Çt3IèFWƒÄ_][¡höI¾höI…Àt V‰¡” JÿP ‹FƒÆƒÄ…Àuã^á” J…Àu?hh`Fjj èôV¡” JƒÄ…Àu Ç” JFh!h`Fjj èËVƒÄ¡01IV…ÀW¾01It‰¡” JVÿP ‹FƒÆƒÄ…Àuè¡X2I¾X2I…Àt‹ ” JV‰ÿQ ‹FƒÆƒÄ…Àuç¡ø1I¾ø1I…Àt‹” J V‰ÿR ‹FƒÆƒÄ…Àuâ¡t3I…À„SUh(h`Fjj è+V‹0FƒÄ½¿´ûI¾löI‹‰nü…Àu(Uÿ@FƒÄ…Àtj PWÿÓÆGƒÄ ‰>ƒ>uÇÀIƒÆEƒÇ þ\úI~ÀhCh`Fjj Çt3Iè¶UƒÄ][¡höI¾höI…Àt V‰¡” JÿP ‹FƒÆƒÄ…Àuã‹t$‹…Àt*‹|$ çÿÁç‹ÏV ȉ‹” JÿR ‹FƒÆƒÄ…Àuã_^á” J…Àu?hh`Fjj è$U¡” JƒÄ…Àu Ç” JFh!h`Fjj èûTƒÄ¡” Jÿ`VWèÉ‹ð‹†D@%€yHƒÈð@‹ŽH‰†D;ÁuAá€yIƒÉðA‰ŽH‹L$‹T$ áÿâÿÁá Áâ Ê‹T$âÿ3ÿ ʉL†‹†D‹L$‰Œ†Ä‹–D‹D$‰„–‹†D‹L†D;Ït-ö„†„t3QèÒ‹ŽDƒÄ‰|ŽD‹–D‰¼–„_^ˆD‰¼†„_^ËŽD‰¼Ž„_^øè†hUVWè΋Ƚ‰L$ 3ÿqD‰~À‹;ÇtöF@tPèY‹L$ƒÄ‰>‰~@‰¾€Ç†ÀÿÿÿÿƒÆMuɉ¹H‰¹D_^]YÃjjjjjjèƒÄËD$‹L$ ‹T$P‹D$QRPjjèSƒÄÃjjjjjjè/ƒÄÃjjjjjjèƒÄÃUVWèØ‹l$‹L$…í‹øtE…ÉtA‹D$…ÀtÇõI‹D$…ÀtÇ‹D$ …ÀtÇõI‹D$$…ÀtÇ_^¸D]ˇH‹·D;Æu_^3À]Ã…Éupæ€yNƒÎðF‹D·…í‰D$t‰·HÇD·‹T$…Òt(‹L$…Ét ‹„·Ä…Àu Ç F‰ë ‰‹”·‰‹L$ …Éu:…ítm‹D·D…Àtö„·„tPèƒÄÇD·D‹D$Ç„·„_^]ËD·D…Àu‹D$$ÇõI…Àt!_Ç‹D$ ^]É‹D$$…Àt ‹Œ·„‰‹D$_^]øÔè6f‹„$ØSUV‹ðW‹è‹ø¡” JçÿÁî Áíæÿ‰|$ …Àu?hh`Fjj ècQ¡” JƒÄ…Àu Ç” JFh!h`Fjj è:QƒÄ‹ ” J‹ÝD$ÁãP‰\$ÿQƒÄ…Àu‰D$ë‹P‰T$¡” J…Àu?hh`Fjj èðP¡” JƒÄ…Àu Ç” JFh!h`Fjj èÇPƒÄ‹” J‹ÆÁà L$ ÃQ‰D$ÿRƒÄ…Àu‰D$ë‹@‰D$¡” J…Àu?hh`Fjj è{P¡” JƒÄ…Àu Ç” JFh!h`Fjj èRPƒÄ¡” Jçÿ‹ÏT$ ËR‰L$ÿPƒÄ…Àu‹” JL$Q‰|$ÿRƒÄ…Àu3ÿë‹x‹\$…ÛuUhÔF„$¬j@Pè€kƒÄ‹l$…íuVhÈFL$lj@QèckƒÄ…ÿ…±‹T$ D$$Rh¼Fj@PèBkƒÄT$$…í‹ÍuL$d…Û‹Ãu„$¤‹¬$ð‹œ$ìRQ‹Œ$ðPQh¤FUSèÿj‹ûƒÉÿ3ÀƒÄò®÷ÑIUÿ;Êu7ƒýv2‹=˜F‹Ã3öj:Pÿ׃Ä…Àt T)û;Âv D(ûÆ:@Fƒþ|Ø_^][ÄÔË×éeÿÿÿV‹t$ …öu¾” J‹D$hVPèBýÿÿƒÄ ‹Æ^ËD$V¾‹‹È‹ÐáðÿÁê 3Ê3ÒÁé 3È‹Á÷ö^R‚3ÁËD$‹ @ˆÃ¸Lè&c¡” J…Àu?hh`Fjj èzN¡” JƒÄ…Àu Ç” JFh!h`Fjj èQNƒÄ‹„$P…ÀuèN‹ ” J‰D$D$PÿQ$ÄPøPè¦b¡” JSU3íV;ÅWu?hh`Fjj èôM¡” JƒÄ;Åu Ç” JFh!h`Fjj èËMƒÄè£M‹ ” J‹ðD$‰t$PÿQ‹øƒÄ;ý…ëhÝh`FhLèž ‹øƒÄ ;ýu_^]¸húI[ÄPÉ7‰¯D‰¯H‡„¹‰hÀ‰(ƒÀIuõ‹” JWÿR ‹ð¡” JW‰t$ÿPƒÄ;ÇtAwD»‹;ÅtöF@t Pè§ ƒÄ‰.‰n@ƒÆKuàWè“ ƒÄ¸húI_^][ÄPÃ;õt5ƒÆD»‹;ÅtöF@t Pèb ƒÄ‰.‰n@ƒÆKuà‹L$QèJ ƒÄ‹Ç_^][ÄPø è&aSUVWhh`FjQ½PèŒ ‹Ø3ÒƒÄ ;Ú„ê‹D$ ˆ;‰T$ŽD$ ‹pƒÀ…ö‰D$ti‹þƒÉÿ3Àò®÷ÑIÑ;Õ‰T$~$jh#h`FEPSè¬ ƒÄ…À„–‹Ø‹þƒÉÿ3Àò®÷Ñ+ù‹÷‹Ñ‹ûƒÉÿò®‹ÊOÁéó¥‹D$‹Ê‹T$ƒáó¤‹L$‹t$ A;ΉL$Œtÿÿÿè¦ýÿÿ‹ø‹·D…öu¾‹D·D…Àtö„·„tPè- ƒÄÇD·D‰\·DÇ„·„_^][ƒÄ ÃSè ƒÄ_^][ƒÄ ø?pÃV‹t$Vj‹PèÐgƒÄPèsƒÄ …Àu^ËVjQèShƒÄPèúrƒÄ ^ÃV‹t$W‹Pè’g‹øVjWè×rƒÄ…Àu_^ËVjQèhƒÄPè¹rƒÄ …Àu_^ËN‹;Ñt:Wh€QèJgƒÄPè‘rƒÄ …Àu_^ËVWh€RèÈgƒÄPèorƒÄ _^ËD$jPètqƒÄËD$jPèdqƒÄÃjè)sjè"sjÿèsƒÄ écu‹D$‹‹D$‹Q‹R‹QRè—ƒÄËD$‹‹D$‹Q‹R‹QRèwƒÄËD$‹‹A ËD$‹‹AËD$‹‹AÃV‹t$WjjÿVèp‹|$jjÿWèbƒÄƒÇ<ƒÆ<¹3Àó¦_^tÀƒØÿøè^SUVW‹|$(‹Pè6?‹l$0‹ð‹MQè'?ƒÄ;ðt"‹Rè?‹ð‹EPè ?ƒÄ+ð‹Æ_^][ƒÄËQèö>ƒÄH‰D$ˆ·‹=´F‹T$(‹t$V‹Pèá>‹L$4‹ØV‰\$(‹RèÎ>‹S‹èƒÄ‰l$ ‹r‹M‹Æ+A…¬ƒþ…‹2‹‹j‹Y…ö‰t$‰D$~;‹ ¸Fƒ9~3ÒjŠURÿ׃Äë‹ °F3ÀŠE‹ŠBƒà…ÀtNE…öɉt$‹D$…À~;¡¸Fƒ8~3ÉjŠ Qÿ׃Äë¡°F3ÒŠ‹ŠQƒà…Àt‹D$HC…À‰D$Å…ö~C‹T$t*ÿ¡¸Fƒ8~3ÉjŠQÿ׃Äë¡°F3ÒŠ‹ŠQƒà…Àt‹D$HN…À‰D$Å‹L$…É~@tÿ‹¸Fƒ:~3ÀjŠPÿ׋L$ƒÄë¡°F3ÒŠ‹ŠPƒà…Àt IN…ɉL$Ä‹D$…ÀŽS‹D$…ÀŽ?3ÉŠMQÿF3Ò‹ðŠRÿFƒÄ;ð…‹D$‹T$ECHJ…À‰D$‰T$Ž‹Â…ÀŽõ¡¸Fƒ8~3ÉjŠMQÿ׃Äë¡°F3ÒŠU‹ŠQƒà…À„«‹¸Fƒ:~3ÀjŠPÿ׃Äë‹°F3ÉŠ ‹ŠHƒà…Àt|‹t$‹ ¸Fƒ9~3ÒjŠURÿ׃Äë‹ °F3ÀŠE‹ŠBƒà…ÀtNE…öɉt$¡¸Fƒ8~3ÉjŠ Qÿ׃Äë¡°F3ÒŠ‹ŠQƒà…Àt‹D$HC…À‰D$Åë‹t$…öÀþÿÿë+ð‹ÆéÀ‹D$…À ‹D$…Àް‹D$‹L$+Áéƒþum‹RèþcƒÄƒø0u]‹D$ ‹L$‹h‹Y‹‹M;Át+Áëm3ö…À~k‹S3ÀŠPÿF‹M3Ò‹øŠ1RÿFƒÄ;øu‹F;ð|Ò‹=´Fë5+ø‹Çë%‹s‹U‹‹:‹Á+Ç…€‹z‹v3Àó¦tÀƒØÿ‹=´F…Àue‹D$‹L$ ‹@‹Q+ÂuS‹D$H‰D$‰Wüÿÿ‹l$,‹|$(‹Rè);‹ðƒÄNx*‹VPè(;‹MVQ‹Øè;‹‹RP腃ąÀuNyÖ3À_^][ƒÄøè¦YV‹t$jVè)v‹vƒÄjèœu‹‹VPD$ jPQRèXs‹D$‹L$‹T$%ÿÁàáÿâÿ Á‹L$Áà ƒÄÁàáÿ^ ÁƒÄËD$…Àt‹…Àt ‹@P蹄ƒÄÃ3ÀËD$S3ÛV…ÀWt‹…Àt‹@P蔄ƒÄ‹ðë3ö‹|$‹‹;Èth{hüFjs飃øtJƒøt7ƒøtthšhüFju郋O ‹F ‹Q‹HRQè{ƒÄ…ÀtIhŽë[h–hüFjrëT‹W ‹N ‹B‹QPRèLƒÄ…Àu.‹G ‹V ‹H‹BQPè2ƒÄ…ÀuV»è€ƒÄ‹Ã_^[Ãh…hüFjth€j èŸîÿÿƒÄVèVƒÄ‹Ã_^[ËD$Pÿ€3IƒÄËD$‹L$PQÿˆ3IƒÄËD$Pÿ”3IƒÄá´ JV‹t$…ÀtjVÿЃÄVÿœ3I¡´ JƒÄ…À^t jjÿЃÄÃS‹\$3É;Ù}3À[ᬠJUV‹t$W‹|$;Á‰ x3ItQVWSQ‰ |3IÿЃÄVWSÿ„3I‹è¡¬ JƒÄ …Àt jVWSUÿЃÄ…ítû~ „JˆE_‹Å^][ÃS‹\$ U‹l$ 3ÉV;éWuo;Ù}_^]3À[ᬠJ‹t$ ‹|$;Á‰ x3ItQVWSQ‰ |3IÿЃÄVWSÿ„3I‹è¡¬ JƒÄ …Àt jVWSUÿЃÄ…ítû~ „JˆE_‹Å^][Ã;Ù}_^]3À[á° J‹t$ ‹|$;Át QVWSQUÿЃÄVWSUÿŒ3I‹ ° JƒÄ…ɉD$tjVWSPUÿÑ‹D$0ƒÄ_^][ÃSU‹l$ 3ÉV;éWuz‹l$;é}_^]3À[ᬠJ‹t$$‹|$ ;Á‰ x3ItQVWUQ‰ |3IÿЃÄVWUÿ„3I‹Ø¡¬ JƒÄ …Àt jVWUSÿЃÄ…Û„©ýŽ „J_ˆ^‹Ã][Ët$;ñ}_^]3À[á° J;Át‹T$$QR‹T$(RVQUÿЃÄ‹D$$‹L$ PQVÿ„3I‹Ø‹D$$ƒÄ …Ût‹È‹õ‹Ñ‹ûÁéó¥‹Êƒáó¤‹t$PUèŒUÿ3I¡° JƒÄ …Àt‹L$$‹T$ jQRVSUÿЃÄ_^‹Ã][á´ JV‹t$…ÀtjVÿЃÄVÿ3I¡´ JƒÄ…À^t jjÿЃÄøàFËD$VW‹0‹D$ Ht}ƒèt6ƒè…™‹F3ÿ;Çt Pè„ÿÿÿƒÄ‹WW‹QRètƒÄ ‰F¸_^ÃFPVj èúÇ‹NPQèQÉ‹V4R訌‹F8PèÿÈ‹vƒÄ…öt;Vè/ÿÿÿƒÄ¸_^ÃN3ÿQVj ‰~ ‰~‰~$ÇF ÿÿÿÿ‰~4‰~8‰~Pè-ÇƒÄ _¸^øX FËD$ ‹L$‹T$hX FPQRè׃ÄËD$‹L$hX FPQèl£ƒÄ ÃhX F覮ƒÄËD$hX FP衵ƒÄËD$SU‹l$V‹t$WhX F‹UVPèa‹øƒÄ…ÿu_^][Ã+ët'UOPVQèÈƒÄ …ÀuhX FWè@µƒÄ3À_^][ËÇ_^][øpèöRSU‹¬$€3ÛVW…í‰\$u8èüÈ‹ø…ÿ‰|$„ÈhÈWècɃÄ…À„²‹G¾È‹ßÆë‹´$Œ‹¼$„3À;øu=;Øt‹KS‰Œ$Œèýÿÿ‹¬$ŒƒÄVh FUÿ0FƒÄ ÆD.ÿ‹Å_^][ƒÄpËNR‰´$‰D$‰D$èp3ƒÄ…ÀŽë‹¼$„‹D$‹PQè_3‹Ø‰\$$‹RèQ[ƒÄ …ÀtPèZ‹ðƒÄ…öu‹L$0PjPQèlÌƒÄ t$0‹þƒÉÿ3Àò®‹C÷Ñ‹‹xI‹é‹Hƒùu~‹Óâ€yJƒÊüBum3Ò3É3À;Ú‰T$(‰T$$‰L$ ~€<8t‹ÈƒáÇDŒ ‹L$ @;Ã|ä‹D$$ È‹D$( Èt¸‰D$,‰D$(‰D$$‰D$ ë-‰T$(‰T$$‰T$ ÇD$,ë¸3Ò‰D$,‰D$(‰D$$‰D$ 3À…Û~"‹Èƒáƒ|Œ tŠ 8B€ù r€ù~vƒÂ@;Ã|Þ‹D$‹L$Õ‹ø…ÉD‰D$t@PQèŠÇƒÄ…À„Õ‹T$‹Bë;„$Œò‹„$ˆÇ‹Í‹ÑÆ/@‹øÅÁéó¥‹Êƒá@ó¤‹L$Æ@ÿ=3ö‹Q…Û‹z~F‹Îƒá‹TŒ …Òt43ÉŠ >ƒù |ƒù~~"‹ÑÆ\@ÁúƒâÆx@Š’°3Iˆ@ƒáЉ°3Iˆ@F;ó|º‹”$„‹t$ÆF‹‰t$Pèb1ƒÄ;ðŒôýÿÿ‹\$‹¬$ˆ…ÛtH‹sSèûÿÿƒÄë<‹|$hÞhø FjAjtj èqæÿÿƒÄ…ÿt WèDƃÄ_^]3À[ƒÄpˬ$ˆ‹õ‹D$…ÀuÆ‹Æ_^][ƒÄpÃU‹ìƒäø¸0è OSV‹uW…öÇD$ u 3À_^[‹å]ÃD$PVÿ FjjL$(j$Q‹øèç ƒÄ…ÿ} 3À_^[‹å]Ë] …Ûu 3À_^[‹å]ÃhØÏHVÿÐFƒÄ‰D$…Àt~ë‹D$…Û~ û‹ó|¾PVT$DjRÿÔF‹øƒÄ…ÿ‰|$~,ÛD$ƒìD$DÝ$VPèf ‹L$ƒÄÏ…Û‰L$ ~§+Þ…Û¡‹L$QÿÜFT$@hRè•…ƒÄ ‹D$ _^[‹å]ÃVW3öèí‹=F…ÀuQh0 Fÿ׋ЃÄ…ÒtA‹úƒÉÿ3Àò®‹D$÷ÑI;Èr_3À^ËúƒÉÿ3Àò®‹D$ ÷Ñ+ù‹Ñ‹÷‹øÁéó¥‹Êƒáó¤‹ð_^Ãè·ì…Àuh<ïHÿ׋ЃÄ…Òuº, F‹Â…À„”‹úƒÉÿ3Àò®‹D$÷уÁ;Ès~ƒÉÿ‹ú3À‹T$ ò®÷Ñ+ùS‹Á‹÷‹úÁéó¥‹È3Àƒáó¤¿T IƒÉÿò®÷Ñ+ù‹÷‹Ù‹úƒÉÿò®‹ËOÁéó¥‹Ëƒáó¤¿$ FƒÉÿò®÷Ñ+ù‹÷‹Ù‹úƒÉÿò®‹ËOÁéó¥‹Ë[ƒáó¤‹ò_‹Æ^ËL$ ‹Æ_^ÆÃU‹ìƒäø¸Èè`MSUV„$ôWPÇD$Ç„$ü”ÿ@F‹5<Fh< FÿÖ‹èh, F‰l$ ÿÖh F‹øÿÖh F‰D$$ÿÖ‹5,F‹Ø…Û„”hü FSÿÖhè FS‹èÿÖ…í‰D$to…ÀtkL$QjjhÄ FjÿÕ…Àu!‹T$h€F@PhØRè4‹D$ ƒÄPÿT$L$Qjjh¨ FjÿÕ…Àu‹T$h1@PjDRè‹D$ ƒÄPÿT$Sÿ0F‹l$…í„äh FUÿÖh€ FU‹ØÿÖhl FU‰D$ÿÖ…Û‰D$„³‹L$…É„§…À„ŸhðjjL$$jQÿÓ…Àt8‹D$”$¸Rj@PÿT$…ÀtjjŒ$Àj@QècƒÄ‹T$jRÿT$jjh< FD$$jPÿÓ…Àt;‹T$Œ$¸Qj@RÿT$…ÀthP@j„$Àj@PèƒÄ‹L$jQÿT$Uÿ0Fè”$˜Rÿ4Fhð?j„$ j PèÔƒÄÿ8Fhð?jL$,jQ‰D$4è´‹l$0ƒÄ…í„·h( FUÿÖh FU‹ØÿÖh FU‰D$$ÿÖ…Û‰D$ tÿÓjjT$TjR‰D$\èiƒÄ‹D$…Àt@ƒ¼$u ƒ¼$ür,L$8ÇD$8QÿÐ…Àt‹T$8h@jD$@RPè!ƒÄ‹D$ …Àt!h¿ÿÐhð?jL$,jQ‰D$4èøƒÄUÿ0F…ÿ„¡hì FWÿÖhÔ FW‹ØÿÖhÈ FW‰D$\ÿÖh¼ FW‰D$ÿÖh¬ FW‰D$ÿÖhœ FW‹èÿÖhŒ FW‰D$4ÿÖh| FW‰D$0ÿÖhl FW‰D$8ÿÖh\ FW‰D$<ÿÖhL FW‰D$(ÿÖh< FW‰D$$ÿÖ…Û‰D$P„‹L$…É„ú‹L$…É„î…í„æ‹L$,…ɄڋL$(…Ʉ΋L$0…Ʉ‹L$4…É„¶‹L$ …É„ª‹L$…É„ž…À„–jjÿÓ‹ðƒþÿ„…T$8ÇD$8RVÿÕ…Àtw½$‹D$8h@jL$@PQ袋T$P‹D$LƒÄL$t‰l$tRPQÿT$ …Àt0»P‹T$th@jD$|RPèiƒÄL$tQÿT$…ÀtK…ÛÕT$8RVÿT$4…ÀuŽ„$ŒÇ„$Œ(PVÿT$0…Àt0‹Œ$Œh"@j”$”QRèƒÄ„$ŒPVÿT$8…ÀuÐL$XÇD$XQVÿT$<…Àt'‹T$Xh@jD$`RPè΃ÄL$XQVÿT$(…ÀuÙ”$´Ç„$´$RVÿT$$…Àt0‹„$´h"@jŒ$¼PQ腃Ĕ$´RVÿT$X…ÀuЋD$TV…ÀtÿÐWÿ0F¸_^][‹å]ÃÿpFWÿ0F_¸^][‹å]ø@è¦GSUVWè-úÿÿjjjhh Fÿ$F‹øWÿF‹5F‹ØjW‰\$ÿÖ‹èj W‰l$ ÿÖjUW‰D$ ÿF‹ðVS‰t$$ÿF‰D$ D$8PjVÿF‹t$Hh¶æÿÿhL F¯t$H¯t$LVè•ïÿÿ‹èƒÄ …ít~‹L$3ÛAð…À‰D$~`‹T$‹D$h ÌSjWjRjjPÿF‹L$UVQÿ Fjè¨ÄPT$,jRVUè™`jjD$DjPè)‹D$<ƒÃƒÄ(;Ø| Uè•ñÿÿ‹\$ƒÄ‹L$ QSÿFPÿF‹5 FSÿÖWÿÖ_^][ƒÄ@ÃU‹ìjÿhp FhàBEd¡Pd‰%ƒì¸è6FSVW‰eè3ö95È3It8›‰uü1‰Eähð?VjEäP范Ä›ë¸Ëeè3ö‰5È3IÇEüÿÿÿÿ95Ä3It&MØQÿdF…Àu‰5Ä3IëVVjUØRèCƒÄ95È3Iu!95Ä3Iuÿ`F‰EàVVjEàPèƒÄ‹Mðd‰ _^[‹å]Ã¡Ø J…Àu6Vè΋ð…ötVè΃Ä£Ø J…Àu9Vè£ÄƒÄè‹Å£Ø J…À^t ‹@ …Àt‹L$‹T$ Q‹L$ R‹T$ QRÿЃÄÉ5Ô JëÒ¡Ø J…Àu6Vè‘Í‹ð…ötVè¥ÍƒÄ£Ø J…Àu/Vè3ăÄèÅ£Ø J…À^t‹@…Àt‹L$‹T$QRÿЃÄÉ5Ô Jë܃ÈÿÃ¡Ø J…Àu6Vè!Í‹ð…ötVè5̓Ä£Ø J…Àu/VèÃÃÄè«Ä£Ø J…À^t‹@…Àt‹L$‹T$QRÿЃÄÉ5Ô Jë܃ÈÿÃ¡Ø J…Àu6Vè±Ì‹ð…ötVèÅ̃Ä£Ø J…Àu!VèSÃÄè;Ä£Ø J…À^t‹@…Àt ÿà‰5Ô Jëê3ÀËL$…Ét&‹ƒøu ‹A PèèуÄÃøtu ‹I Qè¶ÎƒÄÃ3ÀÃS‹\$ V‹t$ ‹W‹;Ètjuh| FjejgjèëÙÿÿƒÄ3À_^[Ãøtu3‹C ‹P …Òt‹P…Òt‹P…Òuj{h| Fjgjgjè³ÙÿÿƒÄ3À_^[Ãùt…‹C ‹H QèUs‹øƒÄ…ÿt\‹V ‹B …Àt PèüpƒÄ‹F ‰x ‹K ‹QRè's‹øƒÄ…ÿt.‹F ‹@…Àt PèÎpƒÄ‹N ‰y‹S ‹BPèùr‹øƒÄ…ÿu_^3À[ËN ‹A…Àt PèšpƒÄ‹V ‰z_^¸[ËD$ƒ8tu‹@ ‹H …Ét‹H…Ét‹H…Éu¸Ã3ÀÃh¸h| Fjè¿êÿÿ3ÒƒÄ ;Âuh»h| FjAjjjè¡ØÿÿƒÄ3Àù‰‰H‰P ‰P‰HÃV‹t$…öu3À^ËN …Ét2‹ƒÀúƒønw(3ÒŠ@Bÿ$•0BQè½ÎëQèõËëQè]ӃċL$ Aúƒønw$3ÒŠÀBÿ$•°B¸ë¸të ¸ë3À‰‹D$‰N3É…À•Á‰F ‹Á^ÃÍÿAÝÿAÕÿAæÿABBBB‹D$ƒÀúƒønw!3ÉŠˆpBÿ$`B¸øtøÃ3ÀÃKBWBQB]BV‹t$…ötzh(h| Fj FjÿPè,ƒÄ…À\‹ƒÀúƒønwI3ÉŠˆxBÿ$hB‹V Règ̃ÄVènêÿÿƒÄ^ËF PèɃÄVèWêÿÿƒÄ^ËN QèéЃÄVè@êÿÿƒÄ^ÃI BNB7BZB¸è¦>SUV‹t$(W3ÿ‹F‰|$;lj|$‰|$u jkhÀ Fjijj è÷ÔÿÿƒÄƒÈÿ_^][ƒÄËF(‰D$$‹FT;Çu>èv;ljFTtT‹NQP腃ąÀtC‹Vj{hÀ FjƒÂjRè—*ƒÄÇFP‹F ;Çt"PèPƒÄ;ljD$uhƒéjxé‹FTPè‹VT‹è‰l$ MÿQRè‹ø‹FHƒÄ ;ʼnD$ Œ/Wè.ßÿÿWWVÿV0ƒÄ…À…‹F …À„ ‹D$3ÛPèÆƒÄ…À~4‹L$SQèÄ‹èUWVÿV0ƒÄ…À…€‹T$CRè–ƒÄ;Ø|Ћl$3À…À‰D$,„¸P‹FTP胃ąÀtS‹L$,h¤hÀ FjƒÁjQè‘)‹T$@‹D$(RPèâ‹VP‹D$<‹|$HƒÄBE;ʼnVP‰l$/ÿÿÿë\‹Å‹l$ëh¡hÀ FjAjj èTÓÿÿƒÄ‹VTRjèöƒÄ‹D$…Àt P赃ċD$…Àt PèéÿÿƒÄ‹D$_^][ƒÄËNTQ輋VTXÿSRè¿‹øWè÷ÝÿÿWWVÿV0ƒÄ…À„¿‹FTPèƒÄƒø…ƒWL$0VQÿV,ƒÄ ‰D$…À~7‹T$,RWèÑÝÿÿƒÄ…Àu!Wè”èÿÿ‹|$0‹FTWSPèuƒÄÇFPëb‹D$ƒøÇF\‰~`‰^Xu ‹L$,QèYèÿÿƒÄVjÿT$,ƒÄ‰D$…À„ÿþÿÿë'‹VTRè%‰D$‹FP‹NTHM‰FPEÿPQèìƒÄ ‹ø‹\$ ;Ý|LWè ÝÿÿWWVÿV0ƒÄ…Àu9WT$0VRÿV,ƒÄ ‰D$…ÀŒGt‹|$,‹FTWP裃ąÀ„E;Ý}´Wè½ÜÿÿWWVÿV0ƒÄ…Àul‹\$…Ût2SWVÿV0ƒÄ …Àt%‹NTSQèaƒÄE‰nP‰^`ÇF\ÇD$ë9nP| ÇF\ëÇF\‰~`MVj‰nXÿT$,ƒÄ‰D$…À„þÿÿ‹F…ÀŽ¿‹FP‹^(3ÿ…Àަ‹VTWRèï‹èŠFƒÄ¨u!‹E$öÄtVjÇF\"‰~X‰n`ÿӃąÀtt‹FWPUè—[ƒÄ …Àu&…ÿt ÇF\ëÇF\Vj‰~X‰n`ÿӃąÀt<ƒÿ~&‹E ƒøÿt@;ø~VjÇF\‰~X‰n`ÿӃąÀt‹FPG;øŒZÿÿÿ¸‰D$‹D$…À„-ýÿÿ‹F…À~V‹NT‹n(Qè‹VT‹øOWRè‹Ø‹FjPSè€ÌƒÄƒøt3ƒø‰~X‰^`u ÇF\ëÇF\VjÿՃĉD$‹D$…À„Äüÿÿ‹NTQjèºVÿV4ƒÄ ‰D$…À„¦üÿÿ‹F$V…ÀtÿЃÄ‰D$éžüÿÿè<ƒÄ‰D$éüÿÿ‹D$,Pè¶åÿÿh÷hÀ FjAjj è±ÏÿÿƒÄ3À_^][ƒÄøè9SUV‹t$W‹FT‹n(Pè2‹NTH‹Ø‰FXSQ‰\$(è.‹øŠFƒÄ ¨t V‰T$ëÇD$WWVÿV0ƒÄ …Àt‹ßë7…ÛVjÇF\‰~`ÿՃċø_^][ƒÄËFTKSP‰\$$‰^Xè΃ċ؋D$…ÀŒg‹L$‰NX‹C …À…½Wè5ßÿÿƒÄ‰D$…ÀuVPÇF\‰~`ÿÕ‹øƒÄ…ÿ„.ë*PSè¦ÎƒÄ…ÀVjÇF\‰^`ÿÕ‹øƒÄ…ÿ„æ‹T$RèIøÿÿ‹ ‹D$P‹Q‹Pè÷ƒÄ …ÀuVPÇF\ ‰^`ÿÕ‹øƒÄ…ÿ„Äë~VjÇF\ ‰^`ÿÕ‹øƒÄ…ÿ„¤ÇC ‹‹L$Q‹B‹HQ蛃Ä…ÀuVPÇF\‰^`ÿÕ‹øƒÄ…ÿtlë}VjÇF\ ‰^`ÿÕ‹øƒÄ…ÿtPVj‰^`ÿÕ‹øƒÄ…ÿt?‹D$H‰D$x/‹Ð‹FTRP‹ûèwƒÄ‹Øé°þÿÿ‹L$Qèc÷ÿÿƒÄ‹Ç_^][ƒÄÿ‹Ç_^][ƒÄø@èö6U‹l$HVW‹}‹M‹Eƒÿu+ƒù |+ƒù&‹ÈƒÀ ‹‰T$‹Q‰T$ f‹If‰L$$L$&ë+ƒù } _^3À]ƒÄ@ËЃÀ ‹ ‰L$‹J‰L$ L$(‹R‰T$$Š€úZt6€ú-t1€ú+t,ˆŠPA@ˆŠPA@€ú.u!ŠP@€ú0|€ú9ŠP@€ú0}òëÆ0AÆ0AŠÆZ€úZÆAu3öëA€ú+t€x-t _^3À]ƒÄ@þH¾p ‰€ú- N¾p¾@ I N ‰´H0‚ÿÿu÷Þ‹D$T‹ÏT$4‰L$…ÀÇD$ ‰T$t‹ëD$PPÿÌF‹L$‹D$TƒÄ‹ÖÁâ+Ö÷ÚT$ …Ò‰D$Pt$ƒùu PD$PèCÎëƒùu L$ PQèQÍë T$ PRèÄÌ‹EƒÄƒøuJ¾D$¾L$€ŒAðýÿÿƒù2}ƒÁd¾D$4€¾D$5„Pðýÿÿƒø2}ƒÀd;È|I~ _^¸]ƒÄ@ÃSt$8D$ ŠŠŠÊ:Óu„ÉtŠPŠ^ŠÊ:ÓuƒÀƒÆ„ÉuÜ3ÀëÀƒØÿ…À[uƒÈÿ_^]ƒÄ@ËD$UVW…ÀtPè?òÿÿƒÄ…À„Ò‹l$3ÿUèØƒÄ…À~[WUèÚPèdÛÿÿ‹ðƒÄ …öt#VèòÿÿƒÄ…Àt4Vè¸ôÿÿUG衃Ä;ø|Éë"h`hÀ Fjljnj èÓÊÿÿƒÄ3À_^]Ã…öuhmhÀ Fjkjnj è±ÊÿÿƒÄ3À_^]ÃS_ÿ…Û|"SUèYPèãÚÿÿ‹øVWèzðÿÿWèDôÿÿƒÄKyÞ‹D$[…Àt VPè^ðÿÿƒÄVè%ôÿÿƒÄ_^¸]ËD$‹L$‹T$ P‹D$ Q‹L$ RPQjè`¦ƒÄËD$ ‹T$‹L$PƒÂlQRè™§ƒÄ ËD$‹@`ÃV‹t$ W‹|$…ÿu…ö‹þt_Wè¶UƒÄƒøÿuhähÀ FjyëePèZU‹HƒÄƒùÿu%Vè‰UƒÄƒøÿuhîhÀ Fjyë8Pè-UƒÄ‹t$…öu ‹pë‹t$…öt.VèOƃăøÿu hühÀ Fjxh†j èOÉÿÿƒÄ3À_^ËD$ …ÿt ‹H…Éu‰x…öt ‹H…Éu‰p_¸^ËL$ ‹D$V‹t$3Ò‰N‹L$;‰‰V‰N ‰VP‰V‰V ‰VL‰VTÇFH ‰V\‰VX‰V`‰Vdt$‹H‰N‹H‰N‹H ‰N‹H8‰ND‹H$;Êt‰N0ë‰V‰V‰V‰VDÇF0€B;Ât ‹H ;Êt‰N,ëÇF,PãB;Ât ‹H;Êt‰N(ëÇF(pB;Ât ‹H;Êt‰N$ëÇF$€B;Ât ‹H(;Êt‰N4ëÇF4ÐB;Ât ‹H,;Êt‰N8ëÇF8ÀB;Ât ‹H0;Êt‰N<ëÇF<B;Ât ‹@4;Ât‰F@ëÇF@BVlRVj蘤ƒÄ …Àu%Vè[ÜÿÿhphÀ FjAhj èÃÇÿÿƒÄ3À^ø^ËD$ÃV‹t$ W‹|$VWè/[ƒÄ…Àu_¸^ËL$ öAu_3À^ÃQj‰A\‰q`‰ydÿQ(ƒÄ_^øèÆ0SUV‹t$W‹F¨„²¨t‹FTPèÖƒÄH‰D$ë ÇD$‹D$3í…ÀŒ…‹NTUQ‰nXÇD$ 豋ØT$ SRV‰^`ÿV8ƒÄ…ÀuVPÇF\ÿV(ƒÄë"‹D$PV‰FhÿV<‹øƒÄ…ÿt‹D$SPVÿV@ƒÄ ‹ø‹L$ÇFhQèՃąÿt‹D$E;èŽ{ÿÿÿ_^]¸[YÃ_^]3À[YøèÖ/‹L$D$PQè7Ñÿÿ‹T$ƒÄPjRè÷˃Ä…ÀuƒÄËD$‹L$‰¸ƒÄøè†/SUV‹t$WÇD$‹FT‹~XP蚃ÄH;ø}‹NTGWQ藃ċØë2‹VTPR膋ØSSVÿV0ƒÄ…ÀuVPÇF\!ÿV(‹øƒÄ…ÿ„ø‹l$…ÛtTSèàÕÿÿƒÄ‰D$…ÀuVPÇF\ÿV(‹øƒÄ…ÿ„Æë(PUèƒÅƒÄ…ÀVjÇF\ÿV(‹øƒÄ…ÿ„œöFt^ë3Û‹ES‹H Qè¨÷ÿÿƒÄ…ÀuVPÇF\ÿV(‹øƒÄ…ÿtfë~VjÇF\ ÿV(‹øƒÄ…ÿtL‹U‹B…Àt=SPèa÷ÿÿƒÄ…ÀuVPÇF\ÿV(‹øƒÄ…ÿtë}VjÇF\ ÿV(‹øƒÄ…ÿt¿‹D$Pè\îÿÿƒÄ‹Ç_^][Yøè.‹D$PèŒÏÿÿ‹T$‰D$L$‹Q‹HQèd ƒÄ ƒøÿu ¸ƒÄËD$PjÇ@\ÿP(ƒÄƒÄÃV‹t$W‹FD…ÀtVÿЃÄ‹FT…ÀthîAPè;ƒÄÇFT~lWVjè¡3ÀƒÄ ‰‰G_^ËL$‹D$‰A(ËD$UPè¥4‹èƒÄ…íuƒÈÿ]ËD$SVW…Àt;‹8WèT‹ØƒÄ3ö…Û~(VWèR‹UQèIXƒÄ…Àt F;ó|ä_^[ƒÈÿ]Ã…ö}_^[ƒÈÿ]Ë|$‹Rè ƒÄ;Æ~‹VPè ƒÄ…Àu3öë‹p‹L$ Aÿ‹;È‹Á‹T$…Òu_^[‹Á]Ëv‹È‹Ù‹úÁéó¥‹Ëƒáó¤_^[Æ]ËD$…ÀuËPèŸ ƒÄËD$UPèµ3‹èƒÄ…íu¸þÿÿÿ]ËD$SV‹t$…ÀWt5…ö}ƒÎÿ‹8WèW ƒÄ‹ØF;ó}VWèV ‹UQèMWƒÄ…Àt F;ó|ä_^[ƒÈÿ]ËÆ_^[]ÃV‹t$…öt%‹Pè ‹L$ƒÄ;Á~…É|Q‹Qè ƒÄ^Ã3À^ÃSU‹l$ V…íW„¢‹EPèÇ ‹t$ƒÄ;ÆŽŠ…öŒ‚‹}VWè¦ W‰D$ èœ ‹ØƒÄ ;óÇEu ‹D$_^][Ã…ötNÿQWè… ‹hƒÄë‹T$‹jMVWèn ‹HƒÄE;é};ó}VWèX ‹PƒÀƒÄJF‰;ó|è‹D$_^][Ã_^]3À[ø FøX Fø0FÃh0FèÆ…ƒÄËD$h0FPèÁŒƒÄøhFÃhhF膅ƒÄËD$hhFP范ÄËD$…À¸Ãø|‹L$‹€8uŠP„Òu ƒÀ‰¸Ã3Àøè*‹D$SUV‹t$$‹…öW„83ÉŠ‹Ù‹ùƒáƒã çÀƒù‰\$uL@N…ö„Š3ÒöÁ€t%ƒáÁâ Ê@N‹Ñ„öúÿÿÿêŠöÁ€uÛŠƒáÁâ Ê@N„Ñë @N…ö„Å‹T$ nÿ‰ ‹L$$‰93ɃþŒ«Š€ú€u ¿pëVŠÚÇD$ ƒãpö€‹ût-ƒÿw~‹ÕM…Òtw‹ÇO…À~$3Ò‹ÅŠÁá ÊFM…Àt_‹×O…Òèë‹ÏùÿÿÿwL‹|$ ‹\$‹D$‹l$‰‹U‹D$(+ÖÐ;Ê~h„h¸Fh›jrj èK¿ÿÿƒÄ€Ë€‹Ç‰u_^ Ã][YÃhŒh¸Fj{jrj è#¿ÿÿƒÄ¸€_^][YÃS‹T$U‹l$‹ÅV‹t$W÷Ø‹ÀâÀƒà ‹T$ ƒú} €â ЈAëF ‹òˆA3À…Ò~Áþ@…öø‹ðxÿ‰t$‹Ø…À‹÷~ŠÂ$;÷ˆt €ˆÁú‹ÆN…Àæ‹t$Ë‹T$ƒýu…Òu Æ€A‰_^][Ãú‹Ú ˆA‰_^][Ã3À…Ò~Áú@…ÒøŠÐ‹ø€Ê€ˆA‹ÐH…ÿ~ ˆ‹øÁûH…ÿóÊ_‰^][ËT$‹L$ ƒùB| …É~Áù@…Éø…Òu ƒ|$uƒÀ@ƒú~ …Ò~Áú@…ÒøÃS‹\$ UV‹t$‹ WQ‹>VnFRUPVè=ýÿÿƒÄ‰F ¨€tÇF<_^]3À[Ã}tÇF=_^]3À[Ë‹ +úω ‹F…À‹Ùt…Û}ÇF>_^]3À[Ã~ !u‹F$‹‹+ÊˉNÇF_^]¸[ÃSVW‹|$…ÿu_^3À[Ë_hxh¸Fjè+Ïÿÿ‹ðƒÄ …öu!h{h¸FjAh‚j è ½ÿÿƒÄ3À_^[Ãlj^ÇFÇF ‹‹OPQVè=ƒÄ …Àu‹F…Àt PèIÑÿÿƒÄVè@ÑÿÿƒÄ3À_^[ËW ‹Æ‰V _^[ÃSU‹l$V‹t$W…í}…öu_^]3À[ËþƒÉÿ3Àò®÷ÑI‹é‹\$9+|‹{…ÿuK‹s…öuhZEh¸FPèNÎÿÿƒÄ ëh\Mh¸FQVèµÎÿÿƒÄ‹ø‰C…ÿu‰s_^][Ët$…ö‰+t‹Í‹ÑÁéó¥‹Êƒáó¤‹CÆ(_^]¸[Ãhxh¸FjèßÍÿÿƒÄ …Àuh{h¸FjAh‚j èÀ»ÿÿƒÄ3ÀÃÇÇ@Ç@Ç@ Ãhxh¸FjèÍÿÿ3ÉƒÄ ;Áuh{h¸FjAh‚j è^»ÿÿƒÄ3ÀËT$‰‰P‰H‰H ÃV‹t$…öt‹F…Àt PèªÏÿÿƒÄVè¡ÏÿÿƒÄ^ËT$S‹\$ V‹ ‹3‹Á+Æu‹rW‹{3Àó¦_tÀƒØÿ…Àu‹B‹K+Á^[ø èF$‹D$$V‹5FPL$hìFQÿÖ‹T$8D$Rh˜ÊHPÿÖL$T$,QhàFRhÔFjèÒÂÿÿƒÄ,^ƒÄ ËD$‹Ã‹L$‹T$‹A;ÂtÇA‰QÃSU‹l$ Vj|hF‹ujè(Ìÿÿ‹ØƒÄ …Ût{j~hFjèÌÿÿƒÄ ‰C…ÀtZ3À‹KƒÀƒøÇDü|í‰sÇC ÇÇC‹U ‹CjbhFÁâRPèDÌÿÿƒÄ…Àu‹C…Àt Pè0ÎÿÿƒÄSè'ÎÿÿƒÄ^]3À[ÉC‹M‰ ‹M‹uWÁá‹Ñ‹øÁéó¥‹Êƒáó¤‹E_‰C‹M ‰K ‹U^‰S‹Ã][ÃVj|hFjèQËÿÿ‹ðƒÄ …öt!j~hFjè:ËÿÿƒÄ ‰F…Àu VèªÍÿÿƒÄ3À^Ã3À‹NƒÀƒøÇDü|íÇFÇF ÇÇF‹Æ^ÃVj|hFjèÑÊÿÿ‹ðƒÄ …öt!j~hFjèºÊÿÿƒÄ ‰F…Àu Vè*ÍÿÿƒÄ3À^Ã3À‹NƒÀƒøÇDü|í‹T$ÇF ‰VÇÇF‹Æ^ÃV‹t$…öu3À^Ë‹F A;Á/h•Å‹FhFRPè®ÊÿÿƒÄ…Àu^ËN ‰FÑá‰N ‹S‹\$;Ø}<…Û|8‹VW;Ãz| ‡+Ã+×@‹< ‰9ƒéHuõ‹V‹D$_‰š‹@ÇF‰[^ËN‹T$[‰‹@ÇF‰^ÃSV‹t$ 3ÀW‹…É~‹^‹|$‹Ó9:t@ƒÂ;Á|ô_^3À[Ã…ötö…Étò…À|î;Á}ê‹<ƒQÿ;Ât}‹N@;‹‰\ü|ñ‹H‰‹Ç_^[ÃW‹|$…ÿt;‹…Òt5‹L$ …É|-;Ê})‹GVrÿ‹ˆ;Ît}S‹WA;΋Љ\Šü|ñ[‹^I‰_Ã3À_ÃV‹t$…öWu_ƒÈÿ^ËF…Àu#‹…É~‹v‹T$9„Œ@ƒÆ;Á|ð_ƒÈÿ^ËN…Éu‹NP‹jPQÿLFƒÄÇF‹D$…Àu_ƒÈÿ^ËF‹P‹FjRL$PQÿHFƒÄ…Àu_ƒÈÿ^Ã+FÁø‹ø…ÿ~‹FT$RL¸üQÿVƒÄ…À|O…ÿä‹Ç_^ËD$‹T$‹QRPèÎýÿÿƒÄ ËT$…Òt‹ …É~Aÿ…À|;Á} ‹J‹ ‰‹ÁÃ3ÀËT$…Òt‹ …É~ W‹z3Àó«‰_ÃV‹t$…öt@‹W3ÿ…À~S‹\$‹F‹¸…ÀtPÿӃċG;ø|é[‹F_…Àt PèÊÿÿƒÄVè ÊÿÿƒÄ^ÃV‹t$…öt‹F…Àt PèêÉÿÿƒÄVèáÉÿÿƒÄ^ËD$…ÀuƒÈÿËËD$…ÀuË@‹L$‹ˆÃ‹D$…ÀuËH‹T$‹D$ ‰‘ÃV‹t$…öt$‹F…Àu‹F‹‹VPjQRÿLFƒÄÇF^ËD$‹‹Q$Rè‘ÃÄËD$ ‹T$‹L$P‹Q‹H$Qè‡ÃƒÄ ËL$‹D$P‹‹B$PèÜÃÄËD$‹L$ ‹T$P‹D$QR‹‹Q$RèŃÄÃS‹\$ UV‹t$W…ö„d‹|$‹G,ð;èsÿG‹O‹WX‹Æ‰oÁèÈ…Ò‰O„°O‹Â‰L$‹ÊÖƒáÁøƒú@‚&‹T$ƒù‹,‚w-ÿ$ˆ&B‹\$3ÉŠ C‹é3ÉŠ+ éC3ÉŠ Áá éC3ÉŠ Áá éC‰,‚@ƒø}8¹,‚+È3À3ÒŠŠsC ÂC3҃ŊÁâ ÂC3ÒŠÁâ ÂC‰EüIuÖ‹T$jRWèáÅ‹GXƒÄ ÇGXtÀ‹îÁí…í~USWöÃè¼ÅÁåƒÄ Ý+õ…ötf‹Æ‰wXÁèƒæo…Àt-‹ø3À3ÒŠŠsC ÂC3É3҃Ŋ ŠSÁá ÁCÁâ ÂC‰EüOuÕ‹Î3ÀÞItIt IuŠCÿKÁàK3ÉŠ+ Á3ÒŠSÿ ‰E_^]¸[ÉWX<1ƒÿsR‹l$ƒé‹|…tItIt(‰|…_^]¸[Ë\$3ÉŠ CN‹ùt3ÒŠ3 úCN…öt 3ÉŠ Áá ù‰|…_^]¸[ËòƒâÁþ…Ét‹|$‹,‡ƒùw-ÿ$˜&B‹\$3ÉŠ C‹é3ÉŠ+ éC3ÉŠ Áá éC3ÉŠ Áá éC‹|$@;Ɖl‡ü}4+ð<‡‹îÅ3ɃÇŠ C‹ñ3ÉŠ+ ñC3ÉŠ Áá ñC3ÉŠ Áá ñC‰wüMuÕ…Ò„ ÿÿÿ‹Ê3öÚItIt IuK3ÒŠ‹òÁæK3ÉŠ+ ñ3ÒŠSÿ ò‹L$_‰4^]¸[ÃIO$BZ$Ba$Bk$BÞ%Bé%Bð%Bú%BSUV‹t$W½\F‹NX^‹ÁÁøƒáu3ÿë‹<ƒƒùw5ÿ$à'B‹=\F½]Fçÿ3ÉŠm ùE3ÒŠUÁâ úE3ÉŠMÁá ù‰<ƒ@ƒø~ƒø}ǃjSVètÃƒÄ 3Àë}¹<ƒ+È3Àó«‹Vj‰S8‹FSV‰C<èHËD$ ‹ƒÄ ‹Ñˆ@ÁꈋÑ@_Áêˆ@Á鈋N@‹ÑÁêˆ@ˆ‹Ñ@Áêˆ@Á鈋N@‹ÑÁêˆ@ˆ‹Ñ@Áêˆ@Á鈋N @‹ÑÁêˆ@ˆ‹Ñ@ÁêÁ鈈HÇFX^]¸[Ëÿà&Bñ&Bù&B'B‹D$3ÉÇ#EgÇ@‰«ÍïÇ@þܺ˜Ç@ vT2‰H‰H‰HX¸øèv‹D$ 3É3ÒŠŠp@ Ê@3ÒŠÁâ Ê@3ÒŠÁâ Ê@‰L$3ÉŠ@3ÒŠ0 Ê@3ÒŠpŠ‹D$Áâ Ñ‹L$‰T$PT$QRèÍÈ‹D$‹L$ ‹Ñˆ@ÁꈋÑ@Áêˆ@Á鈋L$@‹ÑÁêˆ@ˆ‹Ñ@ÁêÁ鈈HƒÄËL$3À3ÒŠ@ƒøŠ’´FˆTÿrëáü J…Àtf‹T$SVW3ÉŠ‹ðæÿ:†´Fu&Aƒùrç¸è3I¹‹ú‹ð3Ûó§tƒÀ=h4I|çë_^ƒÈÿ[Ã_^¸þÿÿÿ[ËD$PRè*ƒÄ3À_^[ËL$‹T$QRèƒÄ3ÀÃSUV‹t$3À3ÉŠŠnF ÁF3Ò3É‹l$ŠŠNÁâ ÂFÁá ÁF3É3ÒŠŠvF ÊF3ÒWŠvŠ‹ðÁâ Êæ‹ÑÁêâ3Ö3ÂÁâ3Ê‹Ðâ3óÿÿ‹ðÁâæÌÌ3Ö‹òÁî3ò‹Ñ3Æâ3óÿÿ‹ñÁâæÌÌ3Ö‹òÁî3ò3΋ð‹ÑæUUUUÑêâUUUU3Ö3ÂÒ3Ê‹ÐÁê‹ñâÿÿæÿÿ3Ö3ÊÁâ3‹ÑÑê‹ðâUUUUæUUUU3Ö3ÂÒ3ʋЋñâðÁî æð ò‹ÑâÿáÿÁîÁâ ò ñ¹h4I%ÿÿÿ‰L$‹‹È…ÒtÁáÁè‹Ö ÁÁâÁîëÁáÑè‹Ö ÁÁâÑî%ÿÿÿ ò‹Ð‹øÑê‹ÊçÀá‹Ú Ï‹øÑéçã Ï‹øçàâ ûæÿÿÿÁï Á鋽´F‹ø‹ ´FçÀ × ËÁê‹ÞƒÅ‹<•´F‹Ðƒâ? Ï〃ŋ<•´F Ï‹þÑï‹×çâ Ó‹Þãà ûÁïÁꋽ´ F‹þ‹•´FÁïƒç? Ó‹½´F‹þƒç? Ó‹½´F‹ù Óçÿÿ‹ÚâÿÿÁã ûÁÏÁé‰}ø ÊÁɉMü‹L$ƒÁù¨4I‰L$Œ¹þÿÿ_^][ÃVW‹|$ …ÿtƒÈÿ+Ç‹ø¡$J…À„Ï¡J…ÀthðhÜ"Fjj ÿСJƒÄ‹ J…É„‰Qè}öÿÿƒÄ;ø}w‹ JWQèyöÿÿ‹ðƒÄ…öt!‹I‹Á‰…À‹ JjWRèvöÿÿƒÄ ë3ö¡J…Àth hÜ"Fjj ÿЃÄ…öt<‹FhhÜ"FPÿ$JVèÕ¿ÿÿƒÄ_^áJ…ÀthôhÜ"Fjj ÿЃÄ_^áJ…Àuÿ%DFÿàS‹\$ …ÛWÉ¡ J…À„ÚVhhÜ"FƒÎÿjj 3ÿ+óèÊÿÿÿ¡ JƒÄ…Àt$PèxõÿÿƒÄ;ð}¡ JVPèuõÿÿ‹øƒÄ…ÿtÿh hÜ"Fjj è‡ÿÿÿƒÄ…ÿ^t)‹…ÿt"‹L$‹T$‹D$ QRWPÿ JSèLþÿÿƒÄ_[Ë ”Fh(#Fh£hÜ"FƒÁ@hð"FQÿ,FƒÄÿ%$F¡J…Àt‹T$‹L$R‹T$QSRÿЃÄ_[áJSUV…ÀWt%‹L$$‹T$ Q‹L$ R‹T$ Q‹L$ RQÿЃÄ‹è_^][Ët$…öÄ¡ J…À„ÒhhÜ"FƒÏÿjj 3Û+þè›þÿÿ¡ JƒÄ…Àt%PèIôÿÿƒÄ;ø}‹ JWRèEôÿÿ‹ØƒÄ…Ûtÿh hÜ"Fjj èWþÿÿƒÄ…Ût%‹[…Ût‹D$$‹L$ PQSj ÿ JVè ýÿÿƒÄëH‹”Fh(#Fh£hÜ"FƒÂ@hð"FRÿ,FƒÄÿ%$F¡J…Àt‹L$$‹T$ QRVj ÿЃÄ‹D$‹L$‹(é…ö‰(Ç¡ J…À„ÕhhÜ"FƒÏÿjj 3Û+þè¦ýÿÿ¡ JƒÄ…Àt$PèTóÿÿƒÄ;ø}¡ JWPèQóÿÿ‹ØƒÄ…Ûtÿh hÜ"Fjj ècýÿÿƒÄ…Ût*‹[…Ût#‹L$$‹T$ QRSj ÿ JVè,üÿÿƒÄ‹Å_^][á”Fh(#Fh£hÜ"FƒÀ@hð"FPÿ,FƒÄÿ%$F¡J…Àt‹L$$‹T$ QRVj ÿЃÄ_‹Å^][ËD$ ‹L$‹T$P¡”FQRƒÀ@hð"FPÿ,FƒÄÿ%$FV‹5(Jh¡h8#Fjj è–üÿÿ‹D$ƒÄƒø‡íÿ$…”1BÇ(JÇ<JéÍ3À£(J£<Jé¼ö(J„¯¡<J…Àt èüÿÿ9@JtRh½h8#Fjj èüÿÿhÃh8#Fjj è üÿÿhÄh8#Fjj èùûÿÿ¡(JƒÄ0$ý£(JèÅûÿÿ£@Jÿ<Jë?ö(Jt6¡<J…Àt-H£<Ju%‹(JhÔh8#FƒÊjj ‰(JèœûÿÿƒÄhÝh8#Fjj è†ûÿÿƒÄ‹Æ^ÃIª0B‘0B81B»0B (JV¨„ùhçh8#Fjjè?ûÿÿ (JƒÄ¨uèûÿÿ9@Ju3öë¾hìh8#Fjjè ûÿÿƒÄ…ö„¦jèHþÿÿhNh8#Fjè÷·ÿÿ‹ðƒÄ…öt{¡4J…Àu2hÀ2Bhà2BèöƒÄ£4J…ÀuVèDºÿÿƒÄjèúýÿÿƒÄ3À^Ãè~úÿÿ‹L$‹T$‰‹D$ ‰F‰N‰V ÇFÇF¡4JVP轃ąÀt‰Fjè¬ýÿÿƒÄ3À^ËD$‹T$V‹‹23À;ΕÀ^ËD$V‹‹ÑÁê‹ÂÁà+ÂÁà+‹ÑÁê4Õ+òIÆ^’Áâ+ÑR’’ QÁøèf (JVW3ÿ¨„èhçh8#Fjjè²ùÿÿ (JƒÄ¨uèùÿÿ9@Ju3öë¾hìh8#Fjjè}ùÿÿƒÄ…ö„•jè»üÿÿ¡4JƒÄ3ö…Àteè8ùÿÿ‹ 4J‰D$D$PQè‹ðƒÄ…ötB‹~…ÿt‹GW@‰G‹4JRèoƒÄ‹NI‹Á‰N…À…ÿÇFtÿOV苸ÿÿƒÄ3Àj…ö•À‹ðè8üÿÿƒÄ‹Æ_^ƒÄËÇ_^ƒÄÃVWjwhx#Fj`èеÿÿ‹ð3ÿƒÄ ;÷t jyhx#Fj@è·µÿÿƒÄ ;ljuVè(¸ÿÿƒÄ_3À^Ã3À‹ƒÀƒø@‰|ü|ò‹D$;Çu¸æBE‰F‹D$ ;Çu¸09B‰F¸‰F ‰~‰F‰~$‰~(‰~,‰~0‰~4‰~8‰~<‰~@‰~D‰~H‰~L‰~P‰~T‰~X‰~\ÇFÇFÇF ‹Æ_^ÃS‹\$…ÛtA‹C W3ÿ…Àv%V‹‹¸…Àt‹pPèj·ÿÿƒÄ‹Æ…öuî‹C G;ørÝ^‹ QèP·ÿÿSèJ·ÿÿƒÄ_[øè6 SUV‹t$3ÒW‹F$‹N Áà÷ñ‹VÇF\;ЇË^‹~(AG‰N ‹NCˉF‹‰~(Lj‹V,ˆ‹ ˜<˜…ɉT$t&‹A3Ò÷t$;Ót‹A‰‹U‰Q‰Mëy‹…ÉuÚ‹F‹N;Ár]‹^‹ÑãhVhx#F QR芴ÿÿ‹Ð3íƒÄ;Õu ‹F\‰n@‰F\ë'‹F;Ãs ‹Ë<‚+È3Àó«‹F‰^‰F‹F,@‰n‰F,‰‹\$L$QSVèL‹øƒÄ ‹…ÉuOhÁhx#Fj è ³ÿÿƒÄ …Àu‹F\_@‰F\^]3À[YÉÇ@‹T$‰P‰‹V@‹N$3ÀBA‰V@‰N$_^][Yˉ‹ND_A‰ND^][YËL$D$V‹t$PQVÇF\èÄ‹ƒÄ …Éu ‹FL@‰FL3À^ËQSW‰‹Q葵ÿÿ‹FH‹~$‹N ƒÄ@O‰FHƒù‰~$‹Ç†¶Áà3Ò÷ñ9F ‚¦‹F‹V‹‹|üDüÇ‹F…ÀuL‹V‹hrhx#FÁâRPè*³ÿÿƒÄ…Àu ‹F\_@‰F\‹Ã[^ËN4‹VA‰‰N4‹NÑéÑê‰NI‰V‰NëH‰F‹N ‹‹F0I‰N ‹N@ ЉF0‹…Àu‰9‹Ã_[^ËH…Ét ‹Á‹H…Éu÷‰x‹Ã_[^ËL$D$V‹t$PQVÇF\褋ƒÄ …Àu ‹FT@‰FT3À^ËNP‹A‰NP^ÃSU‹l$ ‹] Kx&VW‹|$‹E‹˜…Àt‹‹pQÿ׃ċƅöuïKyâ_^][ËD$U‹h Mx0S‹\$VW‹|$‹L$‹‹ª…Àt‹p‹WPÿӃċƅöuîMyÞ_^[]ËD$SUV‹t$WPÿV‹N8ƒÄA‹è‰N8‹L$3Ò‰)÷v;Vs‹Å3Ò÷v‹‹F‰D$‹<‘‘…ÿt3‹NXA‰NX‹G;Åu‹N<‹T$AR‰N<‹PÿT$ƒÄ…Àt G‹Ø‹8…ÿuÍ_^‹Ã][ÃVW‹|$ 3ö…ÿtUŠ„ÀtOSU»¾À Ëî‹Ð‹ÈÁêƒâƒá3ѹ +ÊÃÓí‹Ê‹Ð¯ÐÓæŠG î3êG„À‹õuÄ‹Æ]Áè[3Æ_^Ã_3À^ËD$…Àt‹@$Ã3ÀøèæV‹´$ hD$h˜#Fh#F‰D$ÇD$ÇD$èÂ÷ÿÿŒ$0T$ QVD$RL$$PT$ QD$0RPèk‹D$,‹L$0ƒÄ(…ÀQt,‹”$ PRèÜ‹ð‹D$Pèa²ÿÿƒÄèéøÿÿ‹Æ^ÄË„$ T$RPè]ÜƒÄ ‹ðèÃøÿÿ‹Æ^ÄøLèSUV‹t$pW3ÉŠ3ÿF‰L$$‰L$‰L$‰L$ ÇD$ÿÿÿÿˆ\$‰t$t‹l$x„Ût`‹D$d…Àu ‹D$h‹T$;sLƒÿwBÿ$½HDB€û%u¿ë$‹L$hT$¾ÃP‹D$hQ‹L$hRPQèÆ ‹L$4ƒÄŠFˆ\$‰t$tƒÿuœ‹L$h‹t$_‹J;Ö‹T$lÀ^÷Ø]‰[t‹H‰D$‹L$X‹D$TjT$Q‹L$XRPQèp ‹T$‹D$pJ‰ƒÄ`þÃÀàƒø‡‚3ÒŠ|DBÿ$•dDBŠƒÉF‰L$ ˆ\$‰t$téÿÿÿŠƒÉF‰L$ ˆ\$‰t$téÿÿÿŠƒÉF‰L$ ˆ\$‰t$téëþÿÿŠƒÉF‰L$ ˆ\$‰t$téÔþÿÿŠƒÉF‰L$ ˆ\$‰t$té½þÿÿ¿é³þÿÿ¡¸Fƒ8~‹L$jáÿQÿ´F‹L$(ƒÄë¡°F‹T$âÿ‹ŠPƒà…Àt#‹D$$F‰t$t€¾ÃŠ^ÿTPЈ\$‰T$$éOþÿÿ€û*uŠ‹EƒÅF‰l$x‰D$$ˆ\$‰t$t¿é'þÿÿ€û.…œŠF¿ˆ\$‰t$té þÿÿ‹¸Fƒ:~‹D$j%ÿPÿ´F‹L$(ƒÄë¡°F‹T$âÿ‹ŠPƒà‹T$…Àt$…Ò}3ҾÊ’Fˆ\$TPЉt$t‰T$é ýÿÿ€û*uŠ‹EƒÅF‰l$x‰D$ˆ\$‰t$t¿éxýÿÿ¾ÃƒÀ´ƒø%wP3ÒŠ¤DBÿ$•DBÇD$ë,€>lu ÇD$FëÇD$ëÇD$ëÇD$ŠFˆ\$‰t$t¿éýÿÿ¾ÃxÛƒÿS‡_3ÒŠ—üDBÿ$•ÌDB‹D$Ht#Htƒèt ‹EƒÅ‰l$xë‹E‹UƒÅ‰l$xë ¿EƒÅ‰l$x™Q‹L$Q‹L$,Q‹L$pj R‹T$|PD$(R‹T$|PQRè*ƒÄ(éêƒÉ ‹D$ƒÉ@Ht%Htƒèt‹EƒÅ‰l$x3Òë‹E‹UƒÅ‰l$xëƒÅ3À‰l$xf‹Eü™€ûou¾ë€ëuöÛÛƒãƒÃ ‹óQ‹L$Q‹L$,Q‹L$pVR‹T$|PD$(R‹T$|PQRè ƒÄ(é`ÝE‹|$‹D$ƒÅ3ö‰l$x3í;þ‰|$(‰t$} ¿‰|$(ÜHFÝT$,ßàöÄtÙàÝ\$,ÇD$-ëöÁÝØt ÇD$+ë öÁtÇD$ ÝD$,èg‹Øƒÿ ‰\$~ ¿ ‰|$(ÝÈF…ÿt ‹ÇÜ Ø#FHu÷ÛD$Ül$,ÙÉÞÉÙÀè+‰D$ÛD$ØéÜÐ#FßàöÄÝØuÿD$‹L$ÝÈF…ÿt ‹ÇÜ Ø#FHu÷ÛD$ØÙßàöÄÝØuÝÈFC…ÿt Ü Ø#FOu÷èÍ‹L$+ȋÿ ™÷ÿEŠ‚¸#FˆD,3¸gfff÷ëÁú‹ÂÁèЋÚtƒýrуýu½‹\$(ÆD,4‹Á¿ ™÷ÿ¸gfffFŠ’¸#FˆT4G÷éÁú‹ÂÁèÐ;ó‹Ê|Ôƒþu¾‹|$‹D$$3ÉÆD4H…ÿ•Á+Á+Å+ÃH+Þ‹ø‰\$‰|$$yÇD$…ÿ}3ÿ‰|$$ŠD$ ¨t÷߉|$$¨ti…ÿŽŽ‹D$…Àt*‹T$h‹L$dPD$R‹T$hPQRèƒÄO‰|$$ÇD$…ÿ~X‹\$hÇD$$‹L$d‹T$`j0D$SPQRè߃ÄOuãë-…ÿ~)‹\$hÇD$$‹L$d‹T$`j D$SPQRè°ƒÄOuã‹D$…Àt‹|$h‹\$d‹L$`PD$WPSQ舃Äë‹|$h‹\$d…í~¾T,3M‹L$`RD$WPSQè_ƒÄ…íá‹D$(…ÀöD$ t7‹l$`j.T$WRSUè6ƒÄ…ö~!¾D4GNPL$WQSUèƒÄ…öåë‹l$`‹t$…ö~j0T$WRSUè÷ƒÄNuë‹t$$…ö-‹|$h‹\$d‹l$`÷Þj D$WPSUèȃÄNuëé‹D$ƒÅ‰l$xéõ‹M‹T$hƒÅQ‹L$hD$R‹T$hPQR‰¬$Œè†ƒÄ鯋D$ƒÅ‰l$x‹mü…À}‹D$d…Àt ÇD$ÿÿÿë ‹D$h‹‰T$3ÿ‹Ý…íu»°#FŠ3À„Òt ŠT@„Òu÷‹t$$+ðy3ööÁt÷Þ…ö~*‹l$h;|$} ‹L$d‹T$`j D$UPQRèüƒÄNG…öÚŠ„Àt.‹l$h;|$}$‹L$d‹T$`¾ÀPD$UPQRCèÉŠƒÄG„ÀuÖ…öÿ;|$õ‹D$h‹T$dj L$P‹D$hQRPè’ƒÄFG…ö|ÒéÌ‹T$$‹EƒÉƒÅQ‹L$QR™jR‹T$xP‹„$€L$(P‹D$|QRP‰¬$ èȃÄ(鈋D$ƒøu‹Mf‹T$ƒÅ‰l$xf‰ëkƒøu‹E‹L$ƒÅ‰l$x‰ëTƒøu‹U‹D$ƒÅ‰‰l$xÇBë6‹M‹T$ƒÅ‰l$x‰ë$‹T$dP‹D$lL$P‹D$hQRPèƒÄëF‰t$t‹t$t3À‰D$$‰D$ŠFˆ\$‰t$t3ÿ‰D$ ÇD$ÿÿÿÿ‹Èésöÿÿ‹ÿá:Bo;B B#BBÈ=B¸>BCB1>BLCBRBBDBDB        ¸(èFü‹D$LSU3íV;ÅW‰l$ÇD$õI‰l$}‰l$\ŠD$`‹t$L‹|$P¨@u4;ý|;õs÷ÞýÇD$-÷ßë¨t ÇD$+ë ¨tÇD$ ¨t ‹L$Tƒùu ÇD$ˆÕHë ƒùuÇD$ô#F¨ tÇD$‹D$»à#F…Àu»¸#F3ÀP‹D$XPWVèOýŠ ‹T$T3ÀˆL,PRWVEèÈü‹ú‹ð Çtƒýr»ƒý‰l$Lu ÇD$L‹l$L‹D$\ÆD,‹ð+õ;ʼnt$\|‹è‹|$ƒÉÿ3À‹T$ò®÷Ñ3ÿI;׋T$X•À+Ð+Õ+Ñ;÷‰T$T}‰|$\‹÷;×}‰|$T‹×ŠD$`¨t;ò}‰T$\‰|$T‹×¨t÷Ú‰T$T‹t$H‹\$@‹l$<;׋|$D~)‰T$`ÇD$Tj VWSUèé‹D$tƒÄH‰D$`uç‹T$T‹D$…ÀtPVWSUèÅ‹T$hƒÄ‹L$Š„Àt#¾ÐRVWSUè§‹D$$ƒÄ@‰D$Š„Àuá‹T$T‹D$\…À~!‰D$\j0VWSUèz‹D$pƒÄH‰D$\uç‹T$T‹D$L…À~'‹D$LH‰D$L¾DPVWSUèH‹D$`ƒÄ…ÀÝ‹T$T…Ò}÷Ú‰T$Tj VWSUè$‹D$hƒÄH‰D$Tuç_^][ƒÄ(ÃS‹\$ U‹l$…ÛV„‹t$‹E9‚…Wƒ;uO…ÀuÇE‹Ehãh˜#FPè ¢ÿÿ‰‹ƒÄ …Év‹T$‹ø‹Á‹2Áéó¥‹Èƒáó¤‹t$‹L$Çë hë‰E‹h˜#FPRè>¢ÿÿƒÄ‰‹E‹;Èsƒ_ë‹t$‹‹M;Ás‹L$‹ …Éu‹ ŠT$ ˆ‹@‰^][øèöø‹D$‹L$ ‰D$‹D$T$‰L$ RL$PT$ QD$RPL$ jQè¡ñÿÿ‹D$ƒÄ…Àu ‹D$=ÿÿÿvƒÈÿƒÄø è–ø‹D$$…À|.=Š}'…Àt @‹Í FI…ÒuhëJ@Õ˜FIƒÄ Ë HJ…ÉtE‰D$D$T$PQÇD$‰T$ è‡îÿÿƒÄ…Àt‹@ƒÄ Ãh(hH]Fjejgj蔎ÿÿƒÄ3ÀƒÄ ø èö÷‹D$$…À|.=Š}'…Àt @‹Í FI…Òuh7ëL@‹Õ˜FIƒÄ Ë HJ…ÉtG‰D$D$T$PQÇD$‰T$ èçíÿÿƒÄ…Àt ‹H‹ƒÄ ÃhHhH]FjejhjèòÿÿƒÄ3ÀƒÄ ø èV÷‹D$$…À|.=Š}'…Àt @‹Í FI…ÒuhWëM@‹ÕœFIƒÄ Ë HJ…ÉtH‰D$D$T$PQÇD$‰T$ èGíÿÿƒÄ…Àt ‹H‹AƒÄ ÃhhhH]FjejfjèQÿÿƒÄ3ÀƒÄ øè¶öSUV‹t$ 3íW;õu _^]3À[ƒÄËF;Å…¯¡HJ;Åt(L$‰l$QP‰t$$èÇìÿÿƒÄ;Åt‹P_^]‹B[ƒÄË~ ÇD$i‰|$‹D$‹ÏÅ™+ÂÑø‹… —I… —I+J u‹v‹Ï‹z3Òó¦tÒƒÚÿ‹t$$‹|$‹Ê…É}‰D$ë~h;l$|®_^]3À[ƒÄÃ…Ûu _^]3À[ƒÄË ‹A_^][ƒÄø$èÆõ‹D$,SUV…ÀW…b‹D$8‰D$¡HJ…Àt*T$L$RPÇD$‰L$ èÚëÿÿƒÄ…Àt‹@‹@ëv3ÛÇD$ƒ‹L$‹L$™+‹øÑÿ‹½ˆƒI,½ˆƒI‹2ŠŠÂ:u„ÀtŠAŠÐ:FuƒÁƒÆ„Òuà3ÀëÀƒØÿ…À}‰|$ë~ _;\$| ë…ít‹M‹A…À…ã¡HJ‹T$8…À‰T$ t-T$L$RPÇD$‰L$ è!ëÿÿƒÄ…Àt ‹@‹@é¡3ÛÇD$ƒ‹L$‹L$ ™+‹øÑÿ‹½”I,½”I‹rŠŠÂ:u„ÀtŠAŠÐ:FuƒÁƒÆ„Òuà3ÀëÀƒØÿ…À}‰|$ë~5_;\$|Ÿ‹L$8jÿQjjèm‹øƒÄ…ÿ®èŒÿÿ_^]3À[ƒÄ$Ã…ítЋM‹A…ÀtÆ|2=Š}+…Àt@‹ Õ FI…ÉuhëR@_^]ŘFI[ƒÄ$Ë HJ…ÉtI‰D$$D$T$PQÇD$‰T$ è êÿÿƒÄ…Àt ‹@_^][ƒÄ$Ãh(hH]FjejgjèŠÿÿƒÄ_^]3À[ƒÄ$ÃjWjèÏËÿÿ‹Øh£hH]FSèí›ÿÿ‹ðƒÄ…öu_^][ƒÄ$ÃjjWT$HjR‰t$Pè·Êÿÿ‹D$L‹L$PjÿPWQèlT$`SRj‰t$lè4nV‹øèžÿÿƒÄ4‹Ç_^][ƒÄ$ø\èöò‹D$dS3ÛW;ÃŽ‹|$p;û„9_„þ‹D$tU;ÃV…¢‹w;ó…»¡HJ;Ãt%L$‰\$QP‰|$$èìèÿÿƒÄ;Ãt ‹P‹ré‹w ÇD$i‰t$|‹D$‹ÎÙ+ÂÑø‹… —I,… —I+J u!‹z‹T$x‹Î‹r3Òó¦tÒƒÚÿ‹|$x‹t$|‹Ê…É}‰D$ë ŽX;\$|¦‹o ‹3ö3É…í‰l$|‰|$x~Š7ŠÐƒâ ʨ€tÁáF;õ|ê¸ÍÌÌÌF÷áÁêƒú~º’Áà+ÈQRL$Xhl]FQÿF|$`ƒÉÿ3À‹”$„ò®‹¬$€D$`÷ÑRIPU‹ùè,j‹œ$‹Œ$˜ƒÄ+ßï3À;ñ‰|$t}f‹L$xŠ 1ŠÑƒâ ÂöÁ€uGPD$Thd]FPÿF|$\ƒÉÿ3ÀƒÄ ò®÷ÑI…Û‹ù~L$PSQUèÆiƒÄ ‹D$t+ßÇï‰D$t3À‹L$|ÁàF;ñ|š‹D$t^]_[ƒÄ\Ã…í„âþÿÿ‹E‹p…ö„Ôþÿÿ»|SþŠ}KvÁà‹ˆ FI…ÉuhWël‹¸œFI…ÿ…Ç…ö|wþŠ}ovÁà‹ˆ FI…ÉuWh7錡HJ…ÀtÑT$L$ RP‰\$ ‰L$$‰t$0èÇæÿÿƒÄ…Àt‹@‹xëŸhhhH]FjejfjèÓ†ÿÿƒÄ닸˜FIëL¡HJ…ÀtAT$L$8RP‰\$‰L$‰t$HèræÿÿƒÄ…Àt‹@‹8ëhHhH]Fjejhjè†ÿÿƒÄ3ÿ‹L$t‹T$pQWRèzhƒÉÿ3ÀƒÄ ò®÷Ñ^I]_‹Á[ƒÄ\ËT$hÆ_3À[ƒÄ\ø è¶ï‹D$$S‰D$ ¡HJUV…ÀWt0T$L$RPÇD$‰L$èÖåÿÿƒÄ…Àt‹@_^]‹@[ƒÄ Ã3ÛÇD$4ƒ‹L$4‹L$™+‹øÑÿ‹½ˆƒI,½ˆƒI‹2ŠŠÂ:u„ÀtŠAŠÐ:FuƒÁƒÆ„Òuà3ÀëÀƒØÿ…À}‰|$4ë~_;\$4| _^]3À[ƒÄ Ã…íu _^]3À[ƒÄ ËM_^]‹A[ƒÄ ÃSU‹l$V…íWt;3Û…í~5+™+‹ø‹D$Ñÿ‹÷¯t$ ð‹D$VPÿT$,ƒÄ…À}‹ïë~_;Ý|Ë_^]3À[ËÆ_^][ÃS‹\$ VW‹|$‹ ‹+Áuk¡PJ…Àt-‹7PèŒÏÿÿƒÄ;Æ~¡PJVPè‰Ïÿÿ‹K‹WQRÿPƒÄ_^[Ës‹GŠŠŠÊ:Óu „ÉtŠPŠ^ŠÊ:ÓuƒÀƒÆ„ÉuÜ_^3À[ÃÀƒØÿ_^[áPJV‹t$W…Àt-‹>Pè ÏÿÿƒÄ;Ç~¡PJWPèÏÿÿ‹NQÿƒÄ ‹È‹_3Á^ËVRè;åÿÿƒÄ‹È‹_3Á^øè†íSVW‹|$ 3Û…ÿu _^3À[ƒÄË TJ…Éu=jèÜÿÿh SBh°SBèðßÿÿj£TJèÜÿÿ‹ TJƒÄ3À…É•À…Àu_^[ƒÄËD$$‰|$‹ð€ä‰D$ D$ PQæ€èWãÿÿƒÄ…Àt3‹H…Ét5…öu1Cƒû rÿÿÿ‹H ¡TJT$ ‰L$RPè$ãÿÿƒÄ…ÀuÍ_^3À[ƒÄË@ _^[ƒÄáTJV…Àu8jè_Ûÿÿh SBh°SBè0ßÿÿj£TJèDÛÿÿ‹TJƒÄ3À…Ò•À…Àu^Ãhºht]FjèÝ”ÿÿƒÄ …Àu^ËL$P‰H‹L$‹Ñ€å‰‹L$ H ‰P‹TJRèåßÿÿ‹ðƒÄ…ötG¡PJW…Àt,‹>Pè:ÍÿÿƒÄ;Ç~¡PJWPè7Íÿÿ‹N ‹Q‹NRQÿPƒÄVèà–ÿÿƒÄ_¸^ËTJ‹B\…Àtì3À^áTJW…ÀtkV‹t$ ‰5LJ‹x Ç@ ¡TJh`VBPè!âÿÿƒÄ…ö^}6‹ TJQèíÞÿÿ‹PJhWBRèÌÿÿƒÄ ÇTJÇPJ_áTJ‰x _øè6ë‹D$V…Àt|‹ LJ…É|;un‹ TJ…Étd‹P‹‰T$ T$€äRQ‰D$ è*àÿÿ‹ðƒÄ…öt@¡PJW…Àt,‹>PèÌÿÿƒÄ;Ç~¡PJWPè Ìÿÿ‹N ‹Q‹NRQÿPƒÄV赕ÿÿƒÄ_^ƒÄËD$Pè–•ÿÿYø`è†êV‹t$hVè»óÿÿƒÄ‰D$…Àt‹ XJD$PQèßÉÿÿ‹ÐƒÄƒúÿuYjYh ]FjyjtjèÀÿÿƒÄ…öu‹˜]F œ]F‰T$ˆD$ëVL$jPQèšdƒÄ T$Rh]FjèÖˆÿÿƒÄ 3À^ƒÄ`ÃS‹\$p…Ûu3öë‹t$tƒþÿuW‹û Î3Àò®÷ÑI_‹ñ¡XJRPè Ëÿÿ‹Œ$ˆ‹PQ‹HR‹”$ˆQ‹Œ$RVSQÿP ƒÄ$…À[ujeh ]Fjxjtjè €ÿÿƒÄ3À^ƒÄ`ø^ƒÄ`áXJh ìAPèÊÿÿƒÄÇXJËL$3À‰‰A‰A‰A ÃSV‹t$ W‹|$‹Nƒáý‰N‹N…Ét‹…Àt…ÿ„½‹‹;Ó„±…ÿ„¿…Ét Qè9hƒÄ‹\$…Ût!Sè˜gƒÄ…Àu!h¢h¸]Fh†é‹PèuɃċ؅Ûto‹QSèƒÉƒÄ…Àuh°h¸]Fh†ëk‹ø‰^‹;Çt6…Àt‹HD…Ét ‹V Rèl“ÿÿƒÄ‰>‹D…ÿthÊh¸]FWèÐÿÿƒÄ ‰F ‹VÿPƒÄ_^[ÃÇF뮃>u©hÀh¸]Fh‹h€jè”~ÿÿƒÄ3À_^[ËT$ ‹D$R‹T$ ‹RPÿQƒÄ ÃSV‹t$ W‹ƒx$~hÐ]Fhæh¸]FèMÖÿÿƒÄ ‹T$‹RVÿQ‹Ø‹D$ ƒÄ…Àt‹‹Q‰‹‹@ …ÀtVÿЋFƒÄ ‰F‹‹~ 3À‹ID‹ÑÁéó«‹Êƒáóª_‹Ã^[ÃSU‹l$…턃}„‹E…Àt*PèûeƒÄ…Àuhh¸]Fj&jnjèŸ}ÿÿƒÄ3À][Ë\$ ‹…Àt‹@ …Àt öCuSÿЃÄ‹…Àt!‹HD…Ét‹C …ÀtQPè¿‹C PèÖ‘ÿÿƒÄ ‹C…Àt PèfƒÄ‹Ó3ɋʼn ‰J‰J‰J ‹‹Ë‰‹P‰Q‹P‰Q‹@ ‰A ‹ ‹AD…Àt2VWhh¸]FPèÿŽÿÿ‹‰C ‹u ‹ø‹JDƒÄ ‹ÁÁéó¥‹Èƒáó¤_^‹ ‹A…Àt USÿЃÄ][Ã]¸[Ãhýh¸]Fjojnjè¯|ÿÿƒÄ3À][øèæ3É‹T$(‰L$V‰L$R‹Á ‰L$‰D$‹D$,L$PQè»üÿÿƒÄ …À„¬‹T$‹D$R‹T$L$PQÿRƒÄ …À„‹‹D$ƒx$~hÐ]Fhæh¸]Fè1ÔÿÿƒÄ ‹L$ ‹D$T$QRÿP‹L$ ‹ð‹D$,ƒÄ…Àt‹Q‰‹A …ÀtL$QÿЋD$‹L$ƒÄ ‰D$ ‹IDW‹|$‹Ñ3ÀÁéó«‹Êƒáóª…ö_t¾ë3ö‹D$…ÀtC‹H …ÉtöD$ uD$PÿÑ‹D$ƒÄ…Àt#‹@D…Àt‹L$…ÉtPQèÔ‹L$QèêÿÿƒÄ ‹D$…Àt Pè)dƒÄ‹Æ^ƒÄÃV‹t$‹…Àt‹@ …Àt öFuVÿЃÄ‹…Àt!‹HD…Ét‹F …ÀtQPèg‹F Pè~ÿÿƒÄ ‹F…Àt Pè¾cƒÄ3ɸ‰‰N‰N‰N ^ËD$‹H Qè“ÊÿÿƒÄËD$ ‹T$‹L$P‹B QPèYÆÿÿƒÄ ËD$‹T$‹H QRèÉÿÿƒÄøø]Føh^FËD$hh^FPèáEƒÄø ^Fø_FËD$ ‹L$‹T$h_FPQR臃ÄËD$‹L$h_FPQè3ƒÄ ËD$h_FPèaEƒÄËD$Ph_FèÁXƒÄÃVjthˆ_Fjè‹ÿÿ‹ðƒÄ …ötèÀÿÿ…À‰t èY…À‰Fu8j~hˆ_FjAh«j èLyÿÿƒÄ…öt‹…Àt Pè¹ÃÿÿƒÄVè°ÿÿƒÄ3À^ËL$¸‰F‰1^ÃVW‹|$ …ÿt+‹7…öt%‹FPè×X‹hÐ]BQèÃÿÿVèdÿÿƒÄÇ_^øèFâ‹D$‹L$(‹T$$S‹UVW‰D$‹ð‹D$0Q‹L$0R‹T$,PQhØ^FD$(RL$(3íPQ‰l$0èsƒÄ ;ʼnD$8އ‹\$‹;;ýt%;Ýt!‹WRè=X‹hÐ]BPè€ÂÿÿWèÊŒÿÿƒÄ‰+jthˆ_Fjè7Šÿÿ‹ØƒÄ ;Ýtèɾÿÿ;ʼnt è¾W;ʼnCuYj~hˆ_FjAh«j èxÿÿƒÄ;Ýt‹;Åt PèoÂÿÿƒÄSèfŒÿÿƒÄhÇhˆ_Fj:hžj èËwÿÿƒÄ3À_^][ƒÄÃÇC‹L$‹S+ÎQRèÇWƒÄ…Àt½‹L$‹C+΋x‹ÑÁéó¥‹Êƒáó¤‹D$Pè,ÂÿÿƒÄ…À~`‹L$UQè*Âÿÿ‹ð3ÿVèÂÿÿƒÄ …À~,WVèÂÿÿ‰h‹PRèÁÿÿƒÄ…À„XÿÿÿVGèäÁÿÿƒÄ;ø|ÔVè§Áÿÿ‹D$EPèÌÁÿÿƒÄ;è| ‹L$Qè‹Áÿÿ‹T$ ‹L$$ÇC‹D$‰‰‹D$<ƒÄ_^][ƒÄøèVà‹D$ SUV‹03ÛW9^„ ‰\$‰\$ƒÍÿèQ½ÿÿ;ÉD$„’‹QèMÁÿÿƒÄ…À~W‹SRèMÁÿÿ‹øƒÄ9ot"è½ÿÿ…À‰D$t_P‹D$ Pè+ÀÿÿƒÄ…ÀtM‹o‹L$WQèÀÿÿƒÄ…Àt8‹CRèöÀÿÿƒÄ;Ø|©jÿjÿhØ^FD$(jPè 0‹N‹øWQè>VƒÄ…Àu5‹D$h°bBPè8Àÿÿhøhˆ_FjAhžj èðuÿÿƒÄƒÈÿ_^][ƒÄËVjÿjÿL$‹BhØ^FT$(QR‰D$(è /‹D$0h°bBPèá¿ÿÿƒÄÇF…ÿ‹Ç|$‹v‹T$ …Ò‹t‹v‹:‹È‹ÙÁéó¥‹Ëƒáó¤_^][ƒÄËD$Pèæ¿ÿÿYøèÖÞV‹t$$‹F$öÄu)jqhl`Fjj è)ÊÿÿVèsjshl`Fjj èÊÿÿƒÄ$‹D$(ƒøÿu ¸^ƒÄÃø|ƒøHë#‰D$¡\J…ÀtL$QPèè½ÿÿƒÄƒøÿtƒÀƒøÿuƒÈÿ^ƒÄÃ…À}‹L$,3ÀQVPÿP ƒÄ ^ƒÄÃøs"‹L$,Å+ÐQV•P¡IPÿP ƒÄ ^ƒÄÃÀøP¡\JPèB¿ÿÿ‹L$4ƒÄQVPÿP ƒÄ ^ƒÄËD$…À}3ÀÃøs Å+ÈP¡IË\JƒÀøPRèï¾ÿÿƒÄøè–Ý‹D$ ƒø| ƒøHƒÄÉD$¡\J…ÀuƒÈÿƒÄÃL$QPèä¼ÿÿƒÄƒøÿu ÀƒÄÃÀƒÄÃV‹t$‹F$öÄ…‡S3ÛWFhPbFjrjxjè£gÿÿƒÄ3À^]YËl$öEthEhPbFjijxjè{gÿÿƒÄ3À^]YÃhHµhPbFPè[yÿÿ3ÒƒÄ ;‰D$uhKhPbFjAjxjè9gÿÿƒÄ3À^]YËMW;ÊtTS‹]Áû;Ú~)‹Q‹q‹y ‹)‰(‰P‰p‰x ƒÀƒÁKuá‹t$‹l$3Ò‹}[ƒçOtOt Ou‹y‰x‹y‰x‹ ‰‹M‹D$ <ˆ‹Æ+ÁÁø;Â~‰‰W‰W‰W ‰W‰W‰W‰WƒÇ Huã+uƒæ‹Î~3Àó«‹D$ _^]YÃS‹\$ V‹t$ W;^~$SVè™þÿÿ‹øƒÄ…ÿt‹…Àt PèÔzÿÿƒÄ‰>‰^‹Æ_^[Ã_^3À[ÃVW‹|$ …ÿu_3À^Ãh'hPbFjè xÿÿ‹ðƒÄ …öuh)hPbFjAjqjèfÿÿƒÄ3À_^ÃWVÇFÇFÇF ÇFÇèA‹øƒÄ…ÿu-‹…ÀtöFu Pè6zÿÿƒÄ‹NŠÁ€Í€¨‰Nt VèzÿÿƒÄ‹Ç_^ÃS‹\$U‹l$V;ÝW„Ê‹u‹C;ð‹Ãë:;ð‰\$~.VSèýÿÿ‹øƒÄ…ÿt‹…Àt PèÊyÿÿƒÄ‰;‰sëÇD$‹D$…Àu_^][ËU‹‹MÁú…Ò~/‰T$‹Q‹q‹y ‹)‰P‹T$‰(‰p‰x ƒÀƒÁJ‰T$uÙ‹l$‹UƒâJtJt Ju‹Q‰P‹Q‰P‹ ‰‹E…À‰Cu ‹…ÀtÇ‹U ‰S _^‹Ã][ÃV‹t$‹Fƒør‹Æë:SƒøW‹Þ}-jVè®üÿÿ‹øƒÄ…ÿt‹…Àt PèéxÿÿƒÄ‰>ÇFë3Û‹Ã_[…Àu^Ë‹L$ ÇF ÇF‰‹ƒ:tÇF¸^ÃSUV‹t$W3ÿ;÷uKh'hPbFjèvÿÿƒÄ ;Çuh)hPbFjAjqjèåcÿÿƒÄ3À_^][ÃÇ@‰x‰x ‰x‰8‹ð‹l$3Û;ïu ‰~‹Æ_^][Ãí/‹N™ƒâÂÁø;Á‹ÆëXí‰t$™ƒâ‹ø‹FÁÿG;ø~4WVè£ûÿÿƒÄ‰D$…Àt‹…Ét QèÜwÿÿ‹D$ƒÄ‰‰~ëÇD$‹D$3ÿ;Çu_^]3À[ÃUÿ‰~ ‹Ê‹ÂÁéAƒà;ï‰Nv8‹l$ÁáB‰T$3ÒŠUÁã ÚE‹ÐH…Òu‹ƒé‰3Û¸‹T$J‰T$uÔ‹F;Ç~‹Dü‹ƒè…Òu ‹VJ‹Ê‰V;Ïê‹Æ_^][ÃS‹\$UV‹K…Éu3ÀëU‹‹DˆüÁáƒé ©ÿÿt%©ÿtÁè¾€ aFƒÀë*Áè¾€ aFƒÀëöÄÿtÁè¾€ aFƒÀë¾€ aFÁƒÀ™ƒâ‹ðÁþ‹î‹ÎN…É~;W‹|$‹Æ‹Î™ƒâ‹Áøá€yIƒÉüA‹‚ÁáÓèG‹ÎN…ɈGÿÑ_‹Å^][ËÅ^][ËT$V‹t$ W‹J‹~‹Á+Çu#‹:‹Aÿ…À| ‚+ú‹‹1;òu Hƒé…À}ï3À_^ÃÀ_ƒà^HÃSUVW‹|$…ÿty‹t$…öti‹G ‹N ;Át ÷ØÀ_$þ^]@[Ã…Àu ¸ƒÍÿëƒÈÿ½‹O‹V;ÊF}_‹Å^][ÃQÿ…Ò|‹6‹+Þ –‹4 ‹9;÷w$rÞJƒé…Ò}í_^]3À[Ã_^]ƒÈÿ[ËL$3À…É•À_^][ËL$U‹ÁV™ƒâW‹èÁýá€yIƒÉàA‹t$‰L$9no‹F};ø‹Æë@;øS‰t$~2WVèäøÿÿ‹ØƒÄ…Ût‹…Àt PèuÿÿƒÄ‰‰~ëÇD$‹L$‹D$[…Àu_^]ËF;Ç}‹@;ÇÇD‚ü|ñ‰~‹ºÓâ‹ ¨¨_^] ʉ¸ËL$V…É}3À^Ët$‹Á™ƒâЋFÁú;Â3À^Ãá€yIƒÉàA¸Óà‹‹4‘#Æ^÷ØÀ÷ØÃ‹D$ ‹T$VW‹|$ ‹t‚ü‹L‡ü;ñt À_ƒà^HÃHþ…É|Š+ú‹‹0;òuâIƒè…É}ï_3À^ÃU‹l$W‹|$…ÿ‹Åt&V7Š „JˆŠ „J@ŠÐ€â€ÂÊNˆ „JuÞ^¡„JW%ÿPUÿTFƒÄ …À_]t€„J?ø¨bFøàbFËD$ ‹L$‹T$hàbFPQRè—ƒÄËD$‹L$hàbFPQè,ƒÄ ËD$hàbFPèq*ƒÄøcFø cFËD$‹L$h cFPQèÌƒÄ ËD$h cFPè*ƒÄø@cFËD$ ‹L$‹T$h@cFPQRèǃÄÃh@cFè¶"ƒÄËD$h@cFPè±)ƒÄø`cFÃh`cFèv"ƒÄø€cFø cFødFø`dFøàdFøeFËD$ ‹L$‹T$hàdFPQRè÷ƒÄËD$‹L$hàdFPQèŒƒÄ ÃhàdFèÆ!ƒÄËD$hàdFPèÁ(ƒÄø eFø@eFø`eFø€eFøÀeFø˜gFøhFÃhhFè&!ƒÄËD$hhFPè!(ƒÄøèæÅV‹t$$3À;ð‰D$ut$L$…ÉtˆD$‹L$,T$R‹T$,PP‹D$hLhFj:éc‹D$8‹L$‹T$…ÒtUSjÿÒƒÄ …À„6‹D$8‹L$‹UÇD$‰T$<‹U …ÒŽ5‹D$<‹L$0jPQ貋ðƒÄ …ö„‹T$0VRèÞ±‹L$‹Ø‹D$@ƒÄ…À„÷ƒø‹ù|€9u ŠQ„Ò„‡‹M ‹T$I;ÑuÆD$$ë Š€âˆT$$‹L$L‹T$$QRVPD$$PSè/ƒÄ…À„™ƒøÿuVSèø%‹D$@‹L$ƒÄë‹L$‹D$8+ùljD$8‹T$‹|$<‹u BƒÇ;Ö‰T$‰|$<}^é$ÿÿÿŠT$@ƒÁ„Ò‰L$uhQhLhFhŸé!+ùÆD$@ljD$8ŠT$H„ÒuW…ÀtShuhLhFh”éô‰t$ é÷ŠT$@„Òtσø|€9uŠQ„Òu ƒÁ‰L$ëµhphLhFh‰éµ‹T$‹E ‹|$0;Ð}W‹D$ë‰D$‹ø;t USWèÇ«ƒÄ ‰t$ƒÇë‹|$ ƒû È„rCÿƒø‡Ìÿ$…pB‹T$(D$$RPWè…1ƒÄ …Àt&én9l$(tBhÏhLhFhjlj è+LÿÿƒÄ‹D$Pèîîÿÿ‹D$ƒÄ…ÀtÇ‹D$_^[]ƒÄ ÃÇéƒ|$(th×hLhFjjë­‹T$$3ÉŠ ‰é÷‹D$(L$$PQWèB¨ƒÄ …Àt“éÛ‹Ã-„£ƒè„š‹7;õu$Sèÿÿ‹ðƒÄ;õuhhLhFjAéFÿÿÿ‰7ë‰^‹l$0€}t#‹F…Àt PèÜ_ÿÿƒÄ‹T$$‹D$(‰V‰ÆEëk‹L$(‹T$$QRVè–ŽÿÿƒÄ …ÀuThhLhFjAjlj èKÿÿVèÔÿÿƒÄÇéÞþÿÿ‹D$(L$$PQWè&ƒÄ …À„Ãþÿÿ‹‹Pâ Ó‰P‹D$…Àt ƒûuÇ@_ÇD$‹D$^[]ƒÄ ÃI*ŒBBNŒB€ŒB׋B»‹B¸è´‹L$SŠ\$(U‹VW‹|$(€ã‰D$…ÿˆ\$4uŠÓ„Òu‹T$0_Â^‰]¸[ƒÄËt$0…öŽd‹èƒþ‰l$ |€8u ŠH„Ʉʋ\$<‹D$8jjSPL$$VT$'QD$4RPjL$t&‹N‹n‹F‰L$H‹N ‰l$‰L$‹NщT$éT$HSD$RL$ PT$QR蕇ÿÿƒÄ…ötX‹T$‹L$H‹l$‰V ‹T$‰N‹Ê‰F+ωn¨‰NÆu6Í;Ë~0hŸhLhFh›jhj èÖGÿÿƒÄÆ3À_^][ƒÄ ËT$‹l$¨€t)h§hLhFjfjhj è¥GÿÿƒÄ…ötÆ_^]3À[ƒÄ ËL$<…É|;L$uu‹L$@‹\$H;Ëui…ötƨt ‹L$8+úù‹ï‹t$,…ötŠÈ€áˆ‹L$0…Ét$ ˆ‹D$ …Àt‰(‹D$(…ÀtŠL$Hˆ‹D$$…Àt‹L$‰‹D$4_^]‰¸[ƒÄ ÊD$D„Àt _^]ƒÈÿ[ƒÄ Ã…ötÆh²hLhFh¨jhj èÜFÿÿƒÄ3À_^][ƒÄ ÃSU‹l$V…íWtlƒ}uf‹\$jjÿSD$ jPèy‹øƒÄ…ÿ_^][ÃjYhhhFWè~Xÿÿ‹ðƒÄ …öu_^]ƒÈÿ[ÃjjÿL$$ST$ QR‰t$0è5ƒÄ‹Ç‰u_^][ËD$jjÿPL$ UQèƒÄ_^][øè–¯SUV‹t$3ÛWŠ‹F‹|$„Ét9„ü;Ãt‹P;Ót‹ê‰l$ë‰\$‹ë¾Éƒù‡×ÿ$à•B‹F…ÀtP‹D$ PWè˜ƒÄ _^][YË\$$‹NT$$VRjW‰\$ ‰L$4è‹è‹D$4ƒÄƒøtƒøt ƒøýÇD$ uÇD$ ƒýÿ„fƒûÿu‰D$‹\$…Ût6‹D$ …Àt‹D$(‹L$PQUjSè%†ÿÿƒÄ‹T$$VRPWèS‹ƒÄʼn‹D$ …À„µ‹L$QUjèцÿÿƒÄ _^][YËVD$$VPjW‰T$4è‹è‹D$4ƒÄƒøtƒøt ƒøýÇD$(uÇD$(ƒýÿ„·‹\$‰D$ …Ût/‹L$(…ÉtjPUjSè‚…ÿÿƒÄ‹L$$VQRWè°‹ƒÄʼn‹D$(…Àt‹D$ PUjè2†ÿÿƒÄ _^][YÃ_‹Å^][YÃ…ít VWjÿÕƒÄ …ÀtEVWè霃Ä…À|*;F }%‹V €4ŠVWèýž‹L$$VQPèñƒÄ_^][YÃ…ít VWjÿÕƒÄ 3À_^][YËT$(‹L$$R‹T$ QVRWÿPƒÄ_^][YËt$…öt‹‹VQÿP ƒÄ…ötÅ‹L$$ƒùÿt¼Š_€â ^ ÑŠL$ Ñ]ˆ[YË\$VWD$ SPèï3ɃÄ;Á|‹~ ‹D$_^][YËD$$‰L$ƒøÿu ÇD$$‰L$(;étVWjÿÕƒÄ …À„Qÿÿÿ‹F ‹N3í‰L$ …À~N‹T$ jRWè/ž‹ØƒÄ …Û„'ÿÿÿSWèûSjPèò‹\$,‹T$4ƒÄØ‹F ƒÂE‰\$;è‰T$ |¶‹\$‹l$$‹D$UPjè­„ÿÿƒÄ ‰D$$…Û„Õþÿÿ‹L$(‹T$QURjS諃ÿÿ‹FƒÄ‰D$ ‹F 3í…À~C‹L$ jQWè›‹ØƒÄ …Û„“þÿÿSWèg‹T$$SRPè[‹T$4‹F ƒÄƒÂE‰T$ ;è|½‹D$…ÀtVWjÿÐƒÄ …À„Qþÿÿ‹D$$_^][YËÿU’B€”BÏ“BJ”B-”B(“B¸$è–«SUV‹t$‹ðhhhFS‰t$8è{RÿÿƒÄ‰D$0…ö„…À…º‹D$_^][ƒÄ$ÃU‰t$DèþŠÿÿƒÄ…ÀŽgVUèüŠÿÿ‹\$DƒÄ‰D$‹j…ÀjÿWuHD$$jPèúùÿÿƒÄ…À~CjYhhhFPèRÿÿ‹ðƒÄ …öt-jjÿL$(WT$$QR‰t$4èÅùÿÿƒÄ‰3ëD$$SPè³ùÿÿƒÄ‹t$@UF‰t$DèqŠÿÿƒÄ;ðŒsÿÿÿ‹D$_^][ƒÄ$ÃU‰D$<ÇD$DèHŠÿÿƒÄ…ÀŽã^‹L$@QUè?Šÿÿ‹T$@‰D$4‰D$$D$@ƒÄ‰Sø…Àtz‹D$8…ÀurjjÿWL$(jQè,ùÿÿ‹øƒÄ…ÿ‹|$ëijYhhhFWè0Qÿÿ‹ðƒÄ …öu ‹|$‹t$ ƒÈÿëF‹T$jjÿD$0RL$(PQ‰t$<èÞøÿÿ‰t$L‹t$4‹Ç‹|$,ƒÄëjjÿT$@WD$(RPè·øÿÿƒÄ‹T$@‹L$,B‰Cü‰ U‰T$DƒÃ èi‰ÿÿ‹L$DƒÄ;ÈŒ ÿÿÿh›Bj UèM‰ÿÿƒÄPVÿLF‹T$LUÇD$T‹‰D$Lè*‰ÿÿƒÄ…À~D^‹ ‹sü‹|$8‹ÑÁéó¥‹ÊUƒáƒÃ ó¤‹Cô‹T$<‹t$DÐF‰T$<‰t$DèêˆÿÿƒÄ;ð|Ët$ ‹T$<‹D$‹L$8ƒø‰ u-U3ÿèĈÿÿƒÄ…À~^‹PWUèàˆÿÿUGƒÃ 覈ÿÿƒÄ;ø|åVèiRÿÿ‹L$4Qè_RÿÿƒÄ‹D$_^][ƒÄ$ètsjjÿÿV‹\$@PjSè˜÷ÿÿ‹øƒÄ…ÿu_^][ƒÄ$ËVRWjèkÿÿ‹l$HƒÄ …í‰D$t'‹D$ ‹NPQWjUèj~ÿÿƒÄjjÿÿVPUSèH÷ÿÿƒÄ‹D$_^][ƒÄ$èt#‹VQRÿV‹L$@P‹D$HPQè÷ÿÿƒÄ_^][ƒÄ$ÃjjÿÿV‹T$DP‹D$DRPèûöÿÿƒÄ_^][ƒÄ$ËD$SV‹t$‹P‹^‹Ê;Ó|‹ËW‹>‹03Àó¦_tÀƒØÿ…Àu‹Â+Ã^[ËT$V‹B…Àt‹@…Àt‹L$R‹T$Q‹L$RQÿЃÄ^Ê‹L$„Àuƒzt ƒ9uƒÈÿ^Ã<u ‹‹t$‹@‰ëƒzüu‹ ‹t$‹ƒÁ‰ë‹D$‹ƒø {„¨Hƒøw{ÿ$…œB‹ ‹q‹A ëq3ö3Àëk‹ƒøÿu À^Ã…Àt‹r…ö~ƒÈÿ^Ã…Àu ‹B…ÀuƒÈÿ^Ê t$ˆL$¸ë/‹T$ ‹ ÷ÚÒD$ #ÐRQè…—ƒÄ^Ã-t,ƒèt'‹ ‹q‹W‹|$…ÿt…Àt‹È‹ÑÁéó¥‹Êƒáó¤_^ËD$ T$ ÷ØÀ#ÂP‹PèvŒƒÄ^Ãè›BsœB$œBLœBâ›BØ›B¸è椋D$jL$PQÇD$ è=3Ò…À‹D$ žÂJ#ƒÄËD$‹L$jPQèƒÄ ÃS‹\$ UV‹CW…Àt ‹@…Àt‹øë3ÿ‹t$‹l$…ö‰|$uÇE¾ƒø‡°ÿ$…¬¡B‹C…À„ž‹@…À„“SUÿЃÄ…À„Ï_^]¸[ËC…À„o‹…À„eÿÐ…À‰E„£_^]¸[Ës…ö„MÿV‹öÁ„ç÷Át_ÇE^]¸[ÃÿVŠ¾Êƒù‡ ÿ$Ä¡B‹H…ÉtЋI …ÉtÉPUÿуĸ_^][ËH…ÉtQUèØƒÄ¸_^][ËH…Ét‹I…ÉtPUÿуĸ_^][Ã…À„vÿÿÿ€ú„mÿÿÿƒx…cÿÿÿ‹@_‰E^]¸[ËH…Éu¶…À„Dÿÿÿ€ú„;ÿÿÿƒx…1ÿÿÿ‹H_‰M^]¸[ÃöÅt_ÇE^]¸[ÃöÁtèïÿÿ…À„V_‰E^]¸[ÃáQPUèþÿÿƒÄ …À„K_^]¸[ÃSUè ƒÄëâ…ÿtSUjÿ×ƒÄ …À„\ƒøtÐ…öu:‹Sh•h„hFRèÚJÿÿ‹øƒÄ …ÿ‰}„ô‹K3À‹ÑÁéó«‹Êƒáóª‹|$SjÿUèz‘ƒÄ …ÿt‚SUjÿ×ƒÄ …À„ø_^]¸[Ã…ÿtSUjÿ×ƒÄ …À„Ùƒø„Iÿÿÿ…öuH‹Chªh„hFPèSJÿÿ‹øƒÄ …ÿ‰}„m‹K3À‹ÑSÁéó«‹ÊVƒáUóªè‘SUèa‘ƒÄ‹C ‹{…ÀÇD$ŽQWUèᒃċðÿW‹öÁ„±÷Át ÇéÒÿWŠ¾Êƒù‡Áÿ$Ü¡B‹H…ÉtÖ‹I …ÉtÏPVÿуÄé ‹H…ÉtQVè{ƒÄ銋H…Ét‹I…ÉtŸPVÿуÄës…Àt’€útƒxu‡‹@‰ë]‹H…ÉuÓ…À„qÿÿÿ€ú„hÿÿÿƒx…^ÿÿÿ‹H‰ë4öÅtÇë'öÁt èÆ}ÿÿ…Àt1‰ëáQPVèüÿÿƒÄ …Àt3‹D$‹K ƒÇ@;Á‰D$}?ééþÿÿhh„hFjAh…j èÙ6ÿÿƒÄh¾h„hFjAjyj èÁ6ÿÿƒÄ3À_^][ËD$…À„ŠýÿÿSUjÿÐƒÄ …À…yýÿÿhÅh„hFjdjyj è…6ÿÿSUè>ƒÄ3À_^][ñB˜ŸBŸB…BVB ŸBžBÒBÒBÒBûBžBw B: B: B: B] Bº B‹D$÷u#ÿP¾ƒùwuÿ$¢B‹H…Ét!‹Á÷tÝ‹D$ÇËH…Étî‹I ë‹H…Étë‹H…Ét‹I…ÉtÒ‹T$PRÿуÄÃ…Àt€8t½ƒxu·‹T$‹H‰ ËL$ÇÃI¢B‚¢B‚¢B‚¢B:¢BO¢B‹D$V‹H…Ét‹I…Ét P‹D$ PÿуÄ^Ã…Àt €8t‹HëƒÉÿqƒþ ‡”3ÒŠ–°£Bÿ$•œ£Bjèý¥ÿÿ‹L$ ƒÄ‰¸^Ã…Àt‹P‹D$^‰¸ËL$¸^ÇÿÿÿÿËT$¸^ÇÃh?h„hFjèÆFÿÿƒÄ …Àu^ËL$Ç@Çÿÿÿÿ^‰‹3À…Ò•ÀÃQè yÿÿ‹L$ ƒÄ‰‹3À^…Ò•ÀÃI£B£B8£Bü¢B£B‹D$jL$PQè/ƒÄ ËD$‹L$jPQèƒÄ øè–S‹\$U‹l$ VW‹E…Û„@ŠM„Ét ƒ;„0…Àt‹@…Àt‹ø‰|$(ë ÇD$(‹|$(¾Áƒø‡ÿ$…l§B‹u…ötm‹¨u%‰D$,ÿV‹è‹Eëž‹+3ÿUèC~ÿÿƒÄ…À~,WUèE~ÿÿƒÄ‰D$,jÿVPD$4PèNÿÿÿUGè~ÿÿƒÄ;ø|ÔUèÚ}ÿÿƒÄÇ_^][ƒÄÃUSè2ƒÄ_^][ƒÄÃ…ÿtUSjÿ×ƒÄ ƒø„bUSèÊ‹ƒÄ‹ð…ÿt USjÿ×ƒÄ …öŒ¥;u œ‹U ¶4ŠVSèNjȋƒÄ‰L$¨tf‹ 3ÿQ‰L$(èz}ÿÿƒÄ…À~4‹D$$WPèx}ÿÿƒÄ‰D$jÿVL$PQèþÿÿ‹T$0GRèF}ÿÿƒÄ;ø|Ì‹D$$Pè}ÿÿ‹L$‹|$,ƒÄÇë%PÿV‹T$PRè>þÿÿƒÄ …ÿt USjÿ×ƒÄ ‹D$,…À…ƒém‹m…í„s‹m…í„h‹ QÿÕƒÄ_^][ƒÄËE…À„M‹@…À„BUSÿЃÄ_^][ƒÄÃUjÿSèÙŠƒÄ …À…ÿtUSjÿ×ƒÄ ƒø„ USèA‹‹E ‹MƒÄÇD$€…ÀT‘ì‰T$ޏ‹D$jPS茋øƒÄ …ÿtWSè`Œ‹ð‹ƒÄ‰t$¨tV‹3öSè|ÿÿƒÄ…À~,VSè|ÿÿƒÄ‰D$jÿWL$PQè"ýÿÿSFèë{ÿÿƒÄ;ð|ÔSè®{ÿÿ‹T$ ‹\$(ƒÄÇë%PÿWPVèëüÿÿƒÄ ‹t$‹D$‹M ƒî@‰t$;Á‰D$ŒLÿÿÿ‹|$(…ÿt USjÿ×ƒÄ ‹D$,…Àu‹PèHEÿÿƒÄÇ_^][ƒÄÃIc¤B.¦Bé¤Bã¥B ¦BפBS‹\$ ‹¨tZU‹l$ VW‹}3öWè#{ÿÿƒÄ…À~,VWè%{ÿÿƒÄ‰D$jÿSPD$Pè.üÿÿWFè÷zÿÿƒÄ;ð|ÔWèºzÿÿƒÄÇE_^][Ã%PÿS‹L$ PQè÷ûÿÿƒÄ [ËT$V…Òt‹B…Àt,‹@ …Àt%‹L$RQÿЃÄ^ËD$‹‹q‹I…É„™ë(€:u‹t$ƒÈÿƒ>„‚ë‹B‹t$ƒøtƒ>toƒÀƒø wP3ÉŠˆü¨Bÿ$è¨B‹Rè]ƒÄÇ^Ã…Òt‹B‰^ÃÇÿÿÿÿ^ÃjVèWÿÿÿ‹QèßCÿÿƒÄ Ç^ËRè tÿÿƒÄÇÇ^ÃI±¨Bž¨BݨB‹¨B̨BVhuh hFjj èìƒÿÿ¡£Ihw‹ðh hF@jj ££Iè̃ÿÿƒÄ ‹Æ^áŒJ…Àu]Vhh hFjj ¾螃ÿÿ¡ŒJƒÄ…ÀuhªBhð©B賊ÿÿƒÄ£ŒJ…Àu3öhh hFjj èbƒÿÿƒÄ…ö^t3¡ŒJhªBPèjŽÿÿ‹ ŒJQè>‹ÿÿƒÄ ÇŒJLjJËD$‹Ã‹D$‹L$‹‹+ÂÃV‹t$hWB‹FPè-xÿÿVèwBÿÿƒÄ ^ø èf—¡ŒJSVW…Àu_hh hFjj ¾貂ÿÿ¡ŒJƒÄ…ÀuhªBhð©BèljÿÿƒÄ£ŒJ…Àu3öhh hFjj èv‚ÿÿƒÄ…ö„®‹\$h0h hFjj ‰\$èP‚ÿÿ‹ ŒJD$PQèÿÿ‹ðƒÄ…öuGh4h hFj è5?ÿÿ‹øƒÄ …ÿt-‰‰wèÂsÿÿ…À‰GWu è•AÿÿƒÄ닌JRèDŠÿÿƒÄ‹÷hEh hFjj èÜÿÿƒÄ…öu"hGh hFjAjijèÐ,ÿÿƒÄ_^ƒÈÿ[ƒÄ ÃhSh hFjƒËÿè¯>ÿÿ‹øƒÄ …ÿu"hVh hFjAjhjè‘,ÿÿƒÄƒÈÿ_^[ƒÄ ËD$ ‹L$$‹T$(h^‰‹D$0‰O‹L$4h hFjj ‰W‰G‰O è?ÿÿ‹VRèövÿÿ‹NƒÄ;Á%‹FjPèñuÿÿƒÄ…ÀtI‹NQèÑvÿÿ‹NƒÄ;Á~Û‹^‹FWSSP‰VèãvÿÿƒÄ hkh hFjj èÝ€ÿÿƒÄ‹Ã_^[ƒÄ Ãhch hFjAjhjèÌ+ÿÿWèF@ÿÿƒÄëÁ¸è6•¡ŒJS3ÛUV;ÃW‰\$u_hh hFjj ¾è{€ÿÿ¡ŒJƒÄ;ÃuhªBhð©Bè‡ÿÿƒÄ;ãŒJu3öhh hFjj è?€ÿÿƒÄ;ó„®‹l$$h0h hFjj ‰l$$è€ÿÿ‹ ŒJD$$PQèèŠÿÿ‹øƒÄ;ûuGh4h hFj èþ<ÿÿ‹ðƒÄ ;ót-‰.‰^è‹qÿÿ;ÉFVu è^?ÿÿƒÄ닌JRè ˆÿÿƒÄ‹þhEh hFjj è¥ÿÿƒÄ;ûu"hGh hFjAjijè™*ÿÿƒÄ_^]3À[ƒÄË\$,hh hFjjÇè_ÿÿ‹GPèuÿÿ‹èƒÄ…í~Eh¡ ­h hFQèF<ÿÿƒÄ ‰D$…Àt#3ö…í~‹Ø‹WVRèétÿÿƒÄ‰FƒÃ;õ|é‹\$,h¨h hFjjèõ~ÿÿƒÄ…í~*‹D$…Àu"h«h hFjAjljèá)ÿÿƒÄ3À_^][ƒÄÃ3ö…í~S‹|$‹…ÀtA‹H…Ét:‹…ÀtPèatÿÿƒÄ;ð|3Àë ‹VPè]tÿÿƒÄ‹‹QR‹RVSP‹D$‹Ë‰V+Ï3Àú‹ÑÁéó«‹Êƒáóª‰_‹Ã^[ÃS‹\$UV‹‹t$;ÖW|‹{‹Ê+Î3Àþé‹k;î| ‹{‹Î+Ê3Àë|N¸VUUU÷é‹ÂÁèЋCÁâ…À‹úuh“hjFWèÏ0ÿÿƒÄ ëh•hjFWUPè2ÿÿƒÄ‹Ð…Òu!h˜hjFjAjdjèšÿÿƒÄ3ö‹Æ_^][É{‹;‹Î‰S+Ï3Àú‹ÑÁéó«‹Êƒáóª‰3‹Æ_^][ÃV‹t$…öWu_3À^ËþƒÉÿ3Àh­ò®÷ÑIhjFyWè20ÿÿƒÄ …Àuh°hjFjAjfjèÿÿƒÄ3À_^Ëϋø‹ÑÁéó¥‹Êƒáó¤_^ËD$ ‹T$V3öW‹|$ƒøvŠ„Ét ˆ BGFHƒøwï…ÀtƃÉÿ3Àò®÷ÑI_‹ÁÆ^øè&‡SUVW‹|$83í…ÿ„ˆ‹T$4ƒÿÿu‹úƒÉÿ3Àò®÷ÑI‹ù¾Oƒø0JŒLƒø2C„€ÿÿÿÁà…ÿ‰D$4joh jFhŠé)¾1AO…ÿ‰L$8ŽÇë‹D$4ƒþ.t ƒþ …½3Ò…ÿ~0¾1OAƒþ ‰L$8t"ƒþ.tƒþ0Œ©ƒþ9 ’…ÿTVÐÐ…íuƒø} ƒú(ƒ”Њڸ€ãÁêˆ\$tŠÚ€ãˆ\@ÁêuñŠ\$‹T$,…Òt1(;T$0lH…À~ŠL‹T$,€É€ˆ *EH…Àì‹L$8‹D$,Eˆ\(ÿëè…ÿ;ÿÿÿ_‹Å^][ƒÄÃjyh jFhƒë9h†h jFh‚ë(hh jFh“ëhŸh jFjkë jih jFjzjdj èÿÿƒÄ_^]3À[ƒÄËD$ ‹L$‹T$jPQRèj’ÿÿƒÄøPèV…‹D$X…Àt@‹H…Ét9VjPD$ jPPè7’ÿÿ‹ðƒÄƒþPv¾P‹T$XL$VQRè8ZƒÄ ‹Æ^ƒÄPËD$Tjh˜]FPèZƒÄ ƒÄPøèæ„‹L$V‹t$T$QR‹L$ ‰D$D$ PT$ QRè­ZÿÿƒÄ¨€t¸fë ƒ|$t&¸thÙh jFPh“j è ÿÿƒÄ3À^ƒÄËD$‹T$L$PQRèƒÄ …Àt‹L$‰^ƒÄøèF„‹D$SUVW3ÿ;Çt ‹(;ïtöEuOh h jFjè›,ÿÿƒÄ ;Çu hh jFjAj{j èÿÿƒÄ3À_^][YÉx ‰x‰x‰8‰xÇ@‹è‹D$‹\$ ‹0‹E;ljt$t 9] É;Çt Pèµ.ÿÿƒÄ;ß‹Ãu¸hòh jFPè,ÿÿ‹UƒÄ ƒÊ;ljE‰U…Šhh jFjAh“j èèÿÿƒÄ;ïtc‹D$;Çt9(tWöEt&‹E;Çt PèB.ÿÿƒÄ‹E;Çt Pè2.ÿÿƒÄ‰}‰}öEt‹E;Çt Pè.ÿÿƒÄ‰}‰} öEt Uè.ÿÿƒÄ_^]3À[YË}‹Ë‹Ñ‹D$Áéó¥‹Êƒáó¤‹L$‰] ËÇE…ÀÇEt‰(‹D$_^‰‹Å][YÃV‹t$…öteöFt,‹…Àt Pè•-ÿÿƒÄ‹F…Àt Pè…-ÿÿƒÄÇFÇöFt‹F…Àt Pèb-ÿÿƒÄÇFÇF öFt VèE-ÿÿƒÄ^ËD$‹T$‹H QRèþzƒÄø@jFÃV‹t$¸‹ND…Éu‹N$…Ét VÿуÄ…Àt‹V@‹NDBA‰V@‰ND^ÃV‹t$W¿‹FDH‰FDuM‹F(…ÀtFS‹\$…ÛtjdhˆjFjj è mÿÿƒÄVÿV(ƒÄ‹ø…Û[tjghˆjFjj èëlÿÿƒÄ…ÿu_3À^ÃjVèç{ƒÄ…ÀujuhˆjFjjjkj&èÎÿÿƒÄ3À_^ËÇ_^ÃV‹t$…öuhhˆjFjCjwj&è¢ÿÿƒÄ3À^ÃWh„hˆjFjj èwlÿÿ‹FDƒÄ…À¿u‹F$…Àt VÿЋøƒÄ…ÿt‹N@‹FDA@‰N@‰FDh†hˆjFjj è4lÿÿƒÄ‹Ç_^ÃV‹t$…öWuh‘hˆjFjCjkj&èÿÿƒÄ3À_^Ãh”hˆjFjj èækÿÿ‹FDƒÄH¿‰FDu4‹F(…Àt-jdhˆjFjj è¾kÿÿVÿV(jghˆjFjj ‹øè¨kÿÿƒÄ$…ÿt$jVè©zƒÄ…ÀujuhˆjFjjjkj&èÿÿƒÄ3ÿh–hˆjFjj èhkÿÿƒÄ…ÿuh™hˆjFjjjkj&è\ÿÿƒÄ3À_^ËÇ_^ø £IÃVhhJ耶ÿÿ3öjh¤J‰5¸J‰5¼Jèf¶ÿÿƒÄ‰5ÀJ‰5ÄJ‰5ÈJ‰5ÌJ‰5ÐJ^ø4èV¡ÔJSUV…ÀW„®hØhØjFjjè¢jÿÿè}jÿÿ‹-ØJ3É;èhÚ”ÁhØjF‹ñjj‰t$0èwjÿÿƒÄ …öuhßhØjFjj è]jÿÿƒÄ¡¼J‹ÀJ‹ÄJ¹¾¤J|$0ó¥‹t$L‹èƉT$=ÿ‰\$£¼J| ™¹ÿ÷ù‰ ¸J‰¼Jë!ÇD$ë‹ ¸Jùÿ} ;Á~£¸J‹Æ¹™÷ù3ɸgfff‹|$…ÒŸÁ÷îÁú‹ÂÁèÐÓÑ…ÿ‰ÄJuhÿhØjFjj èŸiÿÿƒÄL$ QèÒ”ÿÿƒÄ…öŽ ‹ÎƒÆ¸ÍÌÌÌ‹\$H÷æÁê‰L$L‰T$ë‹L$Lƒù‹ñ~¾jèÃûÿÿT$$PR訔ÿÿD$‰~‰F‰~ ‰~‰~‰~‰~‰~ ‰~$‰~,‰F0‹Q SVj‰V(èOéÿÿ‹F<ƒÄ ‹@;Çt.VÿЃÄ…Àu$‹F@;Çt PèKõÿÿƒÄSVjèéÿÿVèé ÿÿƒÄ3ö‹Æ_^[ÃV‹t$…ö„Êh¹h€kFjF0jÿPèbÿÿƒÄ…À¨‹N<‹A…ÀtVÿЃÄ‹F@…Àt PèÔôÿÿƒÄV4RVjèéÿÿ‹F ƒÄ …Àt Pè£ÿÿƒÄ‹F…Àt Pèõ¢ÿÿƒÄ‹F…Àt Pèå¢ÿÿƒÄ‹F…Àt PèÕ¢ÿÿƒÄ‹F…Àt PèÅ¢ÿÿƒÄ‹F …Àt Pèµ¢ÿÿƒÄ‹F$…Àt P襢ÿÿƒÄVèüÿÿƒÄ^øèæt‹D$‹HQè ¢ÿÿƒÀj™ƒâÇD$ ÂT$Áø‰D$D$P‰T$ÆD$ ÿè(¬ÿÿÑàjPjèìLÿÿƒÄ(Ãjè ƒÄÃSVWh„hÀkFjTèìÿÿ‹ð3ÿƒÄ ;÷uh‡hÀkFjAjjjèÌ ÿÿƒÄ3À_^[áèJ;Çu èÅw£èJ‹\$‰F;ßt6SèßòÿÿƒÄ…Àu$h‘hÀkFj&jjjèƒ ÿÿVèýÿÿƒÄ3À_^[É^ ëè ˆ‰F ‹F ;Çt=P舃Ä;ljFu-hŸhÀkFj&jjjè; ÿÿ‹F PèóÿÿVè¬ÿÿƒÄ3À_^[ËN^0‰>‰~‰~‰~‰~‰~‰~ ‰~$‰~(‰~,ÇF8‰~@‰~D‰~H‰~P‰~L‹Q$SVj‰V<è‹æÿÿ‹FƒÄ ‹@;Çt.VÿЃÄ…Àu$‹F ;Çt Pè‡òÿÿƒÄSVjèËæÿÿVè%ÿÿƒÄ3ö‹Æ_^[ÃV‹t$…ö„úhÌhÀkFj F8jÿPè\_ÿÿƒÄ…ÀØ‹N‹A …ÀtVÿЃÄ‹F …Àt PèòÿÿƒÄV0RVjèUæÿÿ‹FƒÄ …Àt PèE ÿÿƒÄ‹F…Àt Pè5 ÿÿƒÄ‹F…Àt Pè% ÿÿƒÄ‹F…Àt Pè ÿÿƒÄ‹F …Àt Pè ÿÿƒÄ‹F$…Àt PèõŸÿÿƒÄ‹F(…Àt PèåŸÿÿƒÄ‹F,…Àt PèÕŸÿÿƒÄ‹FP…Àt Pè5‡ƒÄ‹FL…Àt PèUÿÿƒÄVè ÿÿƒÄ^ËD$hñhÀkFj ƒÀ8jPèU^ÿÿƒÄ3ɃøŸÁ‹ÁËD$‹HQèóžÿÿƒÀƒÄ™ƒâÂÁøËD$‹T$R‹T$ ‹HP‹D$P‹D$RPÿQƒÄËD$‹T$R‹T$ ‹HP‹D$P‹D$RPÿQ ƒÄËD$‹T$R‹T$ ‹HP‹D$P‹D$RPÿQƒÄËD$…ÀuË@‹@$øèqSU‹l$3ÛV;ëW‰\$uè?‡‹è;ë„ã‹t$‹FP;Ãt Pè䅃ĉ^PU訇U臃Ä‹øèˆ,ÿÿ…Àu3‹F;Ãt,‹;Ët&‹@SÁàSPQè+ÿÿ‹NQWèÄ…À„ë‹VRWèGƒÄ…Àtn‹FUPWS舋؃ąÛtY‹V@‹F‹NR‹VUPRWWÿQƒÄ…Àt4‹FPSWè„„ƒÄ ‰FP…Àtèu[ÿÿ‹NPÇD$‰A‹V<€âƒÊ‰V‰~‰~‰~ ‰~‰~‰~‰~$‰~(‰~,‰~0‰~4‰~ ÇF8‹QSVj‰VèÚáÿÿ‹FDƒÄ ‹@;Çt.VÿЃÄ…Àu$‹FH;Çt PèÖíÿÿƒÄSVjèâÿÿVètÿÿƒÄ3ö‹Æ_^[ÃV‹t$…ö„Úh²h lFjF8jÿPè¬ZÿÿƒÄ…À¸‹ND‹A…ÀtVÿЃÄ‹FH…Àt PèdíÿÿƒÄVu ‹F…À„­‹D$ S…ö‹X„”‹F…Àt7P3ÿè0MÿÿƒÄ…À~(‹NWQè/MÿÿPè)uÿÿƒÄ ;ÃtU‹VGRèMÿÿƒÄ;ø|Ø‹…ÀtPP3ÿèóLÿÿƒÄ…À~A‹WPèóLÿÿPèítÿÿƒÄ ;Ãt"‹GQèÍLÿÿƒÄ;ø|Ú[_¸^Ã[_¸^Ã[_¸^Ã[_¸^ÃjjÿW舌ÿÿ‹G$ƒÄ öÐ%ÿ_ƒà ^ ÁèËD$V‹pP…ö„¬‹L$SW‹Y„”‹F…Àt7P3ÿèRLÿÿƒÄ…À~(‹VWRèQLÿÿPèKtÿÿƒÄ ;ÃtU‹FGPè*LÿÿƒÄ;ø|Ø‹…ÀtPP3ÿèLÿÿƒÄ…À~A‹WQèLÿÿPètÿÿƒÄ ;Ãt"‹GRèïKÿÿƒÄ;ø|Ú_[¸^Ã_[¸^Ã_[¸^Ã_[¸^ø^ÃV‹t$ jjÿVè‘‹ÿÿ‹F$ƒÄ öÐ%ÿ^ƒà ÁèËD$SVW‹pP…ö„˜‹F‹\$…Àt7P3ÿè[KÿÿƒÄ…À~(‹NWQèZKÿÿPèTsÿÿƒÄ ;ÃtU‹VGRè3KÿÿƒÄ;ø|Ø‹…ÀtPP3ÿèKÿÿƒÄ…À~A‹WPèKÿÿPèsÿÿƒÄ ;Ãt"‹GQèøJÿÿƒÄ;ø|Ú_^¸[Ã_^¸[Ã_^¸[Ã_^¸[ËD$P‹D$‹‹P‹@QRPè·ÿÿPè1ŽƒÄËD$P‹D$‹‹P‹@QRPè÷ P莃ÄËD$‹L$PQè1ÿÿPèkƒÄ ËD$‹L$PQèÁ PèKƒÄ ËD$‹L$ ‹T$P‹D$ QRPèçÿÿPèA“ƒÄøˆlFø$è¦hD$L$,PQè·˜ƒÄ…Àu!jmh°lFh­h¯j èøþþÿƒÄ3ÀƒÄ$Ë@ƒø2|=–}‹T$,‹D$(RPèƒÄƒÄ$ËL$,‹T$(QRè ƒÄƒÄ$ø$è&hSV‹t$0W…öujèCÿÿ‹ðƒÄ…öu_^[ƒÄ$ÃD$ L$8PQ蘋؃ąÛu_^[ƒÄ$Ë~…ÿtƒ>}4hàhälFjèHÿÿ‹øƒÄ …ÿu_^[ƒÄ$ËF…Àt Pè«ÿÿƒÄ‰~‹‹C‹KR‹S P‹CQ‹K@RÁlPQhÈlFWÿFƒÉÿ3ÀƒÄ ò®÷ÑIÇF‰‹Æ_^[ƒÄ$ø$èFgSV‹t$0W…öujè$Bÿÿ‹ðƒÄ…öu_^[ƒÄ$ÃD$ L$8PQè5—‹ØƒÄ…Ûu_^[ƒÄ$Ë~…ÿtƒ>}4hÌhmFjèhÿÿ‹øƒÄ …ÿu_^[ƒÄ$ËF…Àt PèËÿÿƒÄ‰~‹‹C‹KR‹S P‹CQ@RP‹C™¹d÷ùRhülFWÿFƒÉÿ3ÀƒÄ ò®÷ÑIÇF‰‹Æ_^[ƒÄ$ËL$‹A…ÀuƒÈÿË@…Àt‹T$R‹T$R‹T$R‹T$RQÿЃÄøÃVWh¶h0mFjLèÿÿ‹ð3ÿƒÄ ;÷u_3À^ÃhðÛBè£Cÿÿ‰FÇèCÿÿ‰FF‰~‰^‰~ ‰~‹[;ßt VÿӃąÀt/‰n‹EVPè:DÿÿƒÄ…Àt‹Æ_^][ËF;Çt ‹@;ÇtVÿЃÄVèÒÿÿƒÄ3À_^][ø¸è¶c‹„$¼S‹œ$ÄUVW‹8‹ÃH‰\$‹wt HuK‹„$ÔL$ T$0‰L$‰T$ ‰D$8ë‹„$ÔL$tT$L‰L$‰T$t‰D$`L$QVèÐBÿÿƒÄƒøÿu3íëPVè}Dÿÿ‹èƒÄ…í…¡‹”$Ì‹GP‹rèMDÿÿƒÄ;ð}h‹OVQèLDÿÿ‹HƒÄ…Ét(‹I…Ét!‹P…ÒuT$R‹”$ØRSPÿуÄ…À|u(‹GFPèDÿÿƒÄ;ð|³ë‹Œ$Ì_^]‰A[ĸÃl$‹”$Ì…íÇBu _^]3À[ĸË„$Ø‹M‰‹M‰H‹HtHu-hh0mFjjƒÁ ëhh0mFjjƒÁQè»NÿÿƒÄ_^]¸[ĸøè&bVW‹|$ÇD$…ÿu_3À^YÃhKh0mFjè} ÿÿ‹ðƒÄ …öuhNh0mFjAj|j è_øþÿƒÄ3À_^YÃhTh0mFj j lj~è*Mÿÿ‹ƒÄHtHu4‹Fhh0mFjƒÀ jPë‹Nhh0mFjƒÁjQèîMÿÿƒÄ‹T$SUV‹ZSèë@ÿÿ‹øƒÄƒÿÿ„äƒ>tWSè‘BÿÿƒÄé…S‹ïèqBÿÿƒÄ;ø½USèoBÿÿ‹‹øƒÄ‹‹È+ʉL$…ŸHtHu#‹V‹GRPèUÿÿë ‹N‹WQRè&ÿÿƒÄ…Àuvƒ>u$‹F‹OPQè}ÿÿƒÄ…ÀtSEèÿAÿÿƒÄ;è}Oë‹Ç…ÀtG‹HtHu‹VRèŸë ‹FPè ÿÿƒÄVè› ÿÿh]h0mFjej|j è÷þÿƒÄÇD$ë‹L$V‹QRè«@ÿÿƒÄhbh0mFj j èÅKÿÿ‹D$ ƒÄ][_^Yøè6`VW‹|$ÇD$…ÿu_3À^YÃhmh0mFjèÿÿ‹ðƒÄ …öuhph0mFjAj}j èoöþÿƒÄ3À_^YÃhvh0mFj j lj~è:Kÿÿ‹ƒÄHtHu4‹Fhh0mFjƒÀ jPë‹Nhh0mFjƒÁjQèþKÿÿƒÄ‹T$SUV‹ZSèû>ÿÿ‹øƒÄƒÿÿ„äƒ>tWSè¡@ÿÿƒÄé…S‹ïè@ÿÿƒÄ;ø½USè@ÿÿ‹‹øƒÄ‹‹È+ʉL$…ŸHtHu#‹V‹GRPèeÿÿë ‹N‹WQRè6ÿÿƒÄ…Àuvƒ>u$‹F‹OPQèÿÿƒÄ…ÀtSEè@ÿÿƒÄ;è}Oë‹Ç…ÀtG‹HtHu‹VRè¯ë ‹FPè$ ÿÿƒÄVè« ÿÿh~h0mFjej}j èõþÿƒÄÇD$ë‹L$V‹QRè»>ÿÿƒÄhƒh0mFj j èÕIÿÿ‹D$ ƒÄ][_^YøŒèF^SUVW‹¼$¨Wè¥ÿþÿ‹´$¨‹èD$PUjVè^úÿÿƒÄƒø„–ƒøÿuI‹D$HtHu‹L$Qèéë ‹T$Rè] ÿÿƒÄhõh0mFjjjj èUôþÿƒÄƒÈÿ_^][ČÅÀ„2‹D$HtHu(‹D$P蘃ăÈÿ_^][ČËL$Qèý ÿÿƒÄ_^]ƒÈÿ[ČËT$RWVÿV0ƒÄ …Àt‹„$ ‹L$_^‰]¸[ČËD$HtHu‹T$Rè*ë ‹D$Pèž ÿÿƒÄ‹T$H‰T$T$‹AL$ RPÇD$ ‰L$P‰l$<è<ÿÿ‹øƒÄƒÿÿtk‹‹ß‹HQè>ÿÿƒÄ;ø}W‹S‹BPè>ÿÿ‹øƒÄƒ?uA‹OQèBþþÿPUè›þþÿƒÄ …Àu*‹W‹„$¨RPVÿV0ƒÄ …Àu ‹C‹QRèÁ=ÿÿƒÄ;Ø|©_^]3À[ČËŒ$ ‹G‰‹Ht0HuJ‹Whh0mFjƒÂ jRè¿HÿÿƒÄ¸_^][ČËGhh0mFjƒÀjPè’HÿÿƒÄ_^]¸[ČøˆmFËD$V‹0…ö„…‹F…Àt~‹L$Wƒét.IuihÐæBPèâ7ÿÿ‹N‹øQè7=ÿÿ‹VWRèÍ7ÿÿƒÄ¸_^ÃP3ÿèÊ<ÿÿƒÄ…À~‹FWPèÉ<ÿÿ‰x ‹NQGè¬<ÿÿƒÄ ;ø|â‹Vh°æBRè‡7ÿÿƒÄ_¸^ø^øPnFøÈnFËD$ ‹L$‹T$hÈnFPQRè'•ÿÿƒÄËD$hÈnFPè!½ÿÿƒÄËD$‹‹D$‹‹R‹RèI6ÿÿƒÄËD$‹T$‹‹‹I ‹P +Ê‹ÁËD$…ÀuÃPèÑ;ÿÿƒÄËD$UPèåaÿÿ‹èƒÄ…íu¸þÿÿÿ]ÃSVW‹|$…ÿt8‹L$q…ö}3öWè‡;ÿÿ‹ØƒÄ;ó}VWè‡;ÿÿ‹URè~…ÿÿƒÄ…Àt F;ó|ä_^[ƒÈÿ]ËÆ_^[]ÃV‹t$…öt!VèA;ÿÿ‹L$ƒÄ;Á~…É| QVè;;ÿÿƒÄ^Ã3À^ËD$…ÀuËËD$…ÀuËP3É…ÒŸÁ‹ÁËD$‹T$‹‹‹ ‹+Ê‹Áø<è–YV‹t$D‹PèÉbÿÿƒÄ…ÀtaL$‰L$|WhàçBjjT$h¦IR‰D$è|jÿÿƒÄ…Àt‹ë,¡øJ…Àt'L$QPè½8ÿÿƒÄƒøÿt‹øJPRèh:ÿÿƒÄ…Àu3À^ƒÄ<ËN‹Q‰T$D‹P…ÒtÿÒP‹FT$H‹QRjè“ÿÿƒÄ^ƒÄ<Ë T$DQRjÿPƒÄ ^ƒÄ<ø8èÆX‹D$HSU‹l$D3ÛV…íWu&…ÀtÇÿÿÿÿ‹D$T…À„Š_^Çÿÿÿÿ]3À[ƒÄ8Ã…Àt‹0F…ö}3öU‹þè©9ÿÿƒÄ;ð>WUè§9ÿÿ‹ð‹Pèaÿÿ‹L$\ƒÄ ;Áu‹D$X…Àu{…Ûu}‹ÞUGèm9ÿÿƒÄ;ø|È‹D$X…Û„þ‹t$T…öt Sè<þÿÿƒÄ‰‹ QèOaÿÿƒÄ…À„ðT$‰T$TŒâhàçB‰D$jjD$`h¦IPèúhÿÿƒÄ…Àt&‹ëR‰8‹Þë—‹D$T…À„©_^Çþÿÿÿ]3À[ƒÄ8áøJ…À„ŒL$QPè7ÿÿƒÄƒøÿty‹øJPRèÀ8ÿÿƒÄ…Àte‹K‹Q‰T$X‹P…Òt ÿÒP‹CT$\‹QRjèc‘ÿÿƒÄ_^][ƒÄ8Ë T$XQRjÿPƒÄ _^][ƒÄ8ËD$X…ÀtÇÿÿÿÿ‹D$T…ÀtÇÿÿÿÿ_^]3À[ƒÄ8ÃVW‹|$ ‹t$‹L$UÁáSñé@‹Q‹_‹O‹W ‰Ï‹.1×!ß„(x¤j×1×ø‰ßÁÀ‹nØ1Ï!Ç”*V·Çè1Ïú‰ÇÁ ‹nÂ1ß!׌)Ûp $1ßù‰×ÁÁ‹n Ñ1Ç!Ïœ+îνÁ1Çû‰ÏÁËnË1×!ß„(¯|õ1×ø‰ßÁÀ‹nØ1Ï!Ç”**ƇG1Ïú‰ÇÁ ‹nÂ1ß!׌)F0¨1ßù‰×ÁÁ‹nÑ1Ç!Ïœ+•Fý1Çû‰ÏÁËn Ë1×!ß„(ؘ€i1×ø‰ßÁÀ‹n$Ø1Ï!Ç”*¯÷D‹1Ïú‰ÇÁ ‹n(Â1ß!׌)±[ÿÿ1ßù‰×ÁÁ‹n,Ñ1Ç!Ïœ+¾×\‰1Çû‰ÏÁËn0Ë1×!ß„("k1×ø‰ßÁÀ‹n4Ø1Ï!Ç”*“q˜ý1Ïú‰ÇÁ ‹n8Â1ß!׌)ŽCy¦1ßù‰×ÁÁ‹n<Ñ1Ç!Ïœ+!´I1Çû‰ÏÁËnË„(b%ö1ß!׋n1Ïø‰ßÁÀØ”*@³@À1Ç!Ï‹n,1ßú‰ÇÁ ÂŒ)QZ^&1×!ß‹.1Çù‰×ÁÁÑœ+ªÇ¶é1Ï!Ç‹n1×û‰ÏÁÃË„(]/Ö1ß!׋n(1Ïø‰ßÁÀØ”*SD1Ç!Ï‹n<1ßú‰ÇÁ ÂŒ)æ¡Ø1×!ß‹n1Çù‰×ÁÁÑœ+ÈûÓç1Ï!Ç‹n$1×û‰ÏÁÃË„(æÍá!1ß!׋n81Ïø‰ßÁÀØ”*Ö7Ã1Ç!Ï‹n 1ßú‰ÇÁ ÂŒ)‡ Õô1×!ß‹n 1Çù‰×ÁÁÑœ+íZE1Ï!Ç‹n41×û‰ÏÁÃË„(éã©1ß!׋n1Ïø‰ßÁÀØ”*ø£ïü1Ç!Ï‹n1ßú‰ÇÁ ÂŒ)Ùog1×!ß‹n01Çù‰×ÁÁÑœ+ŠL*1Ï!Ç‹n1×û‰ÏÁÃË1×1ß„(B9úÿøÁÀ‹n ‰ß”*öq‡Ø1Ï1Ç‹n,ú‰ÇÁ Â1ß1׌)"amùÁÁ‹n8‰×œ+ 8åýÑ1Ç1Ï‹nû‰ÏÁÃË1×1ß„(D꾤øÁÀ‹n‰ß”*©ÏÞKØ1Ï1Ç‹nú‰ÇÁ Â1ß1׌)`K»öùÁÁ‹n(‰×œ+p¼¿¾Ñ1Ç1Ï‹n4û‰ÏÁÃË1×1ß„(Æ~›(øÁÀ‹.‰ß”*ú'¡êØ1Ï1Ç‹n ú‰ÇÁ Â1ß1׌)…0ïÔùÁÁ‹n‰×œ+ˆÑ1Ç1Ï‹n$û‰ÏÁÃË1×1ß„(9ÐÔÙøÁÀ‹n0‰ß”*å™ÛæØ1Ï1Ç‹n<ú‰ÇÁ Â1ß1׌)ø|¢ùÁÁ‹n‰×œ+eV¬ÄÑ1Ç1Ï‹.û¿ÿÿÿÿÁÃË1× ß„(D")ô1Ï‹nø¿ÿÿÿÿÁÀ1ÏØ Ç”*—ÿ*C1ß‹n8ú¿ÿÿÿÿÁ 1ß ׌)§#”«1Ç‹nù¿ÿÿÿÿÁÁ1ÇÑ Ïœ+9 “ü1׋n0û¿ÿÿÿÿÁÃ1×Ë ß„(ÃY[e1Ï‹n ø¿ÿÿÿÿÁÀ1ÏØ Ç”*’Ì 1ß‹n(ú¿ÿÿÿÿÁ 1ß ׌)}ôïÿ1Ç‹nù¿ÿÿÿÿÁÁ1ÇÑ Ïœ+Ñ]„…1׋n û¿ÿÿÿÿÁÃ1×Ë ß„(O~¨o1Ï‹n<ø¿ÿÿÿÿÁÀ1ÏØ Ç”*àæ,þ1ß‹nú¿ÿÿÿÿÁ 1ß ׌)C£1Ç‹n4ù¿ÿÿÿÿÁÁ1ÇÑ Ïœ+¡N1׋nû¿ÿÿÿÿÁÃ1×Ë ß„(‚~S÷1Ï‹n,ø¿ÿÿÿÿÁÀ1ÏØ Ç”*5ò:½1ß‹nú¿ÿÿÿÿÁ 1ß ׌)»Ò×*1Ç‹n$ù¿ÿÿÿÿÁÁ1ÇÑ Ïœ+‘Ó†ë1׋l$ûÆ@ÁË}Ëø‹}û‹}ù‹} ú‰E‰]‹<$‰M‰U 9÷ƒùÿÿX[]_^ÃÌÌVW‹t$ 1ÉSU‹‹\$‹~ÁÀ‰Æ1ø%ðððð1Æ1ÇÁljø1÷çðÿ1ø1þÁÀ‰Ç1ð%33331Ç1ÆÁƉð1þæüü1ð1÷ÁÀ ‰Æ1ø%ªªªª1Æ1ÇÑÇ-´F‹L$û„‹1Û‹Q1ð1É1ò%üüüüâÏÏÏψÈáÁÊ3<+ˆÓ3¼)ˆñÁè3¼+ˆãÁê3¼)ˆñ%ÿâÿ3¼+3¼)‹L$3¼(3¼*‹A1Û‹Q 1ø1É1ú%üüüüâÏÏÏψÈáÁÊ34+ˆÓ3´)ˆñÁè3´+ˆãÁê3´)ˆñ%ÿâÿ3´+3´)‹L$3´(3´*‹A1Û‹Q1ð1É1ò%üüüüâÏÏÏψÈáÁÊ3<+ˆÓ3¼)ˆñÁè3¼+ˆãÁê3¼)ˆñ%ÿâÿ3¼+3¼)‹L$3¼(3¼*‹A1Û‹Q1ø1É1ú%üüüüâÏÏÏψÈáÁÊ34+ˆÓ3´)ˆñÁè3´+ˆãÁê3´)ˆñ%ÿâÿ3´+3´)‹L$3´(3´*‹A 1Û‹Q$1ð1É1ò%üüüüâÏÏÏψÈáÁÊ3<+ˆÓ3¼)ˆñÁè3¼+ˆãÁê3¼)ˆñ%ÿâÿ3¼+3¼)‹L$3¼(3¼*‹A(1Û‹Q,1ø1É1ú%üüüüâÏÏÏψÈáÁÊ34+ˆÓ3´)ˆñÁè3´+ˆãÁê3´)ˆñ%ÿâÿ3´+3´)‹L$3´(3´*‹A01Û‹Q41ð1É1ò%üüüüâÏÏÏψÈáÁÊ3<+ˆÓ3¼)ˆñÁè3¼+ˆãÁê3¼)ˆñ%ÿâÿ3¼+3¼)‹L$3¼(3¼*‹A81Û‹Q<1ø1É1ú%üüüüâÏÏÏψÈáÁÊ34+ˆÓ3´)ˆñÁè3´+ˆãÁê3´)ˆñ%ÿâÿ3´+3´)‹L$3´(3´*‹A@1Û‹QD1ð1É1ò%üüüüâÏÏÏψÈáÁÊ3<+ˆÓ3¼)ˆñÁè3¼+ˆãÁê3¼)ˆñ%ÿâÿ3¼+3¼)‹L$3¼(3¼*‹AH1Û‹QL1ø1É1ú%üüüüâÏÏÏψÈáÁÊ34+ˆÓ3´)ˆñÁè3´+ˆãÁê3´)ˆñ%ÿâÿ3´+3´)‹L$3´(3´*‹AP1Û‹QT1ð1É1ò%üüüüâÏÏÏψÈáÁÊ3<+ˆÓ3¼)ˆñÁè3¼+ˆãÁê3¼)ˆñ%ÿâÿ3¼+3¼)‹L$3¼(3¼*‹AX1Û‹Q\1ø1É1ú%üüüüâÏÏÏψÈáÁÊ34+ˆÓ3´)ˆñÁè3´+ˆãÁê3´)ˆñ%ÿâÿ3´+3´)‹L$3´(3´*‹A`1Û‹Qd1ð1É1ò%üüüüâÏÏÏψÈáÁÊ3<+ˆÓ3¼)ˆñÁè3¼+ˆãÁê3¼)ˆñ%ÿâÿ3¼+3¼)‹L$3¼(3¼*‹Ah1Û‹Ql1ø1É1ú%üüüüâÏÏÏψÈáÁÊ34+ˆÓ3´)ˆñÁè3´+ˆãÁê3´)ˆñ%ÿâÿ3´+3´)‹L$3´(3´*‹Ap1Û‹Qt1ð1É1ò%üüüüâÏÏÏψÈáÁÊ3<+ˆÓ3¼)ˆñÁè3¼+ˆãÁê3¼)ˆñ%ÿâÿ3¼+3¼)‹L$3¼(3¼*‹Ax1Û‹Q|1ø1É1ú%üüüüâÏÏÏψÈáÁÊ34+ˆÓ3´)ˆñÁè3´+ˆãÁê3´)ˆñ%ÿâÿ3´+3´)‹L$3´(3´*é‹Ax1Û‹Q|1ð1É1ò%üüüüâÏÏÏψÈáÁÊ3<+ˆÓ3¼)ˆñÁè3¼+ˆãÁê3¼)ˆñ%ÿâÿ3¼+3¼)‹L$3¼(3¼*‹Ap1Û‹Qt1ø1É1ú%üüüüâÏÏÏψÈáÁÊ34+ˆÓ3´)ˆñÁè3´+ˆãÁê3´)ˆñ%ÿâÿ3´+3´)‹L$3´(3´*‹Ah1Û‹Ql1ð1É1ò%üüüüâÏÏÏψÈáÁÊ3<+ˆÓ3¼)ˆñÁè3¼+ˆãÁê3¼)ˆñ%ÿâÿ3¼+3¼)‹L$3¼(3¼*‹A`1Û‹Qd1ø1É1ú%üüüüâÏÏÏψÈáÁÊ34+ˆÓ3´)ˆñÁè3´+ˆãÁê3´)ˆñ%ÿâÿ3´+3´)‹L$3´(3´*‹AX1Û‹Q\1ð1É1ò%üüüüâÏÏÏψÈáÁÊ3<+ˆÓ3¼)ˆñÁè3¼+ˆãÁê3¼)ˆñ%ÿâÿ3¼+3¼)‹L$3¼(3¼*‹AP1Û‹QT1ø1É1ú%üüüüâÏÏÏψÈáÁÊ34+ˆÓ3´)ˆñÁè3´+ˆãÁê3´)ˆñ%ÿâÿ3´+3´)‹L$3´(3´*‹AH1Û‹QL1ð1É1ò%üüüüâÏÏÏψÈáÁÊ3<+ˆÓ3¼)ˆñÁè3¼+ˆãÁê3¼)ˆñ%ÿâÿ3¼+3¼)‹L$3¼(3¼*‹A@1Û‹QD1ø1É1ú%üüüüâÏÏÏψÈáÁÊ34+ˆÓ3´)ˆñÁè3´+ˆãÁê3´)ˆñ%ÿâÿ3´+3´)‹L$3´(3´*‹A81Û‹Q<1ð1É1ò%üüüüâÏÏÏψÈáÁÊ3<+ˆÓ3¼)ˆñÁè3¼+ˆãÁê3¼)ˆñ%ÿâÿ3¼+3¼)‹L$3¼(3¼*‹A01Û‹Q41ø1É1ú%üüüüâÏÏÏψÈáÁÊ34+ˆÓ3´)ˆñÁè3´+ˆãÁê3´)ˆñ%ÿâÿ3´+3´)‹L$3´(3´*‹A(1Û‹Q,1ð1É1ò%üüüüâÏÏÏψÈáÁÊ3<+ˆÓ3¼)ˆñÁè3¼+ˆãÁê3¼)ˆñ%ÿâÿ3¼+3¼)‹L$3¼(3¼*‹A 1Û‹Q$1ø1É1ú%üüüüâÏÏÏψÈáÁÊ34+ˆÓ3´)ˆñÁè3´+ˆãÁê3´)ˆñ%ÿâÿ3´+3´)‹L$3´(3´*‹A1Û‹Q1ð1É1ò%üüüüâÏÏÏψÈáÁÊ3<+ˆÓ3¼)ˆñÁè3¼+ˆãÁê3¼)ˆñ%ÿâÿ3¼+3¼)‹L$3¼(3¼*‹A1Û‹Q1ø1É1ú%üüüüâÏÏÏψÈáÁÊ34+ˆÓ3´)ˆñÁè3´+ˆãÁê3´)ˆñ%ÿâÿ3´+3´)‹L$3´(3´*‹A1Û‹Q 1ð1É1ò%üüüüâÏÏÏψÈáÁÊ3<+ˆÓ3¼)ˆñÁè3¼+ˆãÁê3¼)ˆñ%ÿâÿ3¼+3¼)‹L$3¼(3¼*‹1Û‹Q1ø1É1ú%üüüüâÏÏÏψÈáÁÊ34+ˆÓ3´)ˆñÁè3´+ˆãÁê3´)ˆñ%ÿâÿ3´+3´)‹L$3´(3´*‹T$ÑΉø1÷窪ªª1ø1þÁÀ‰Ç1ð%üü1Ç1ÆÁÇ ‰ø1÷ç33331ø1þÁƉ÷1Ææðÿ1÷1ðÁÇ ‰þ1Ççðððð1þ1øÁȉ‰r][_^ÃVW‹D$ 1ÉSU‹0‹\$ÁÆ‹xÁÇ-´F‹L$û„‹1Û‹Q1ð1É1ò%üüüüâÏÏÏψÈáÁÊ3<+ˆÓ3¼)ˆñÁè3¼+ˆãÁê3¼)ˆñ%ÿâÿ3¼+3¼)‹L$3¼(3¼*‹A1Û‹Q 1ø1É1ú%üüüüâÏÏÏψÈáÁÊ34+ˆÓ3´)ˆñÁè3´+ˆãÁê3´)ˆñ%ÿâÿ3´+3´)‹L$3´(3´*‹A1Û‹Q1ð1É1ò%üüüüâÏÏÏψÈáÁÊ3<+ˆÓ3¼)ˆñÁè3¼+ˆãÁê3¼)ˆñ%ÿâÿ3¼+3¼)‹L$3¼(3¼*‹A1Û‹Q1ø1É1ú%üüüüâÏÏÏψÈáÁÊ34+ˆÓ3´)ˆñÁè3´+ˆãÁê3´)ˆñ%ÿâÿ3´+3´)‹L$3´(3´*‹A 1Û‹Q$1ð1É1ò%üüüüâÏÏÏψÈáÁÊ3<+ˆÓ3¼)ˆñÁè3¼+ˆãÁê3¼)ˆñ%ÿâÿ3¼+3¼)‹L$3¼(3¼*‹A(1Û‹Q,1ø1É1ú%üüüüâÏÏÏψÈáÁÊ34+ˆÓ3´)ˆñÁè3´+ˆãÁê3´)ˆñ%ÿâÿ3´+3´)‹L$3´(3´*‹A01Û‹Q41ð1É1ò%üüüüâÏÏÏψÈáÁÊ3<+ˆÓ3¼)ˆñÁè3¼+ˆãÁê3¼)ˆñ%ÿâÿ3¼+3¼)‹L$3¼(3¼*‹A81Û‹Q<1ø1É1ú%üüüüâÏÏÏψÈáÁÊ34+ˆÓ3´)ˆñÁè3´+ˆãÁê3´)ˆñ%ÿâÿ3´+3´)‹L$3´(3´*‹A@1Û‹QD1ð1É1ò%üüüüâÏÏÏψÈáÁÊ3<+ˆÓ3¼)ˆñÁè3¼+ˆãÁê3¼)ˆñ%ÿâÿ3¼+3¼)‹L$3¼(3¼*‹AH1Û‹QL1ø1É1ú%üüüüâÏÏÏψÈáÁÊ34+ˆÓ3´)ˆñÁè3´+ˆãÁê3´)ˆñ%ÿâÿ3´+3´)‹L$3´(3´*‹AP1Û‹QT1ð1É1ò%üüüüâÏÏÏψÈáÁÊ3<+ˆÓ3¼)ˆñÁè3¼+ˆãÁê3¼)ˆñ%ÿâÿ3¼+3¼)‹L$3¼(3¼*‹AX1Û‹Q\1ø1É1ú%üüüüâÏÏÏψÈáÁÊ34+ˆÓ3´)ˆñÁè3´+ˆãÁê3´)ˆñ%ÿâÿ3´+3´)‹L$3´(3´*‹A`1Û‹Qd1ð1É1ò%üüüüâÏÏÏψÈáÁÊ3<+ˆÓ3¼)ˆñÁè3¼+ˆãÁê3¼)ˆñ%ÿâÿ3¼+3¼)‹L$3¼(3¼*‹Ah1Û‹Ql1ø1É1ú%üüüüâÏÏÏψÈáÁÊ34+ˆÓ3´)ˆñÁè3´+ˆãÁê3´)ˆñ%ÿâÿ3´+3´)‹L$3´(3´*‹Ap1Û‹Qt1ð1É1ò%üüüüâÏÏÏψÈáÁÊ3<+ˆÓ3¼)ˆñÁè3¼+ˆãÁê3¼)ˆñ%ÿâÿ3¼+3¼)‹L$3¼(3¼*‹Ax1Û‹Q|1ø1É1ú%üüüüâÏÏÏψÈáÁÊ34+ˆÓ3´)ˆñÁè3´+ˆãÁê3´)ˆñ%ÿâÿ3´+3´)‹L$3´(3´*é‹Ax1Û‹Q|1ð1É1ò%üüüüâÏÏÏψÈáÁÊ3<+ˆÓ3¼)ˆñÁè3¼+ˆãÁê3¼)ˆñ%ÿâÿ3¼+3¼)‹L$3¼(3¼*‹Ap1Û‹Qt1ø1É1ú%üüüüâÏÏÏψÈáÁÊ34+ˆÓ3´)ˆñÁè3´+ˆãÁê3´)ˆñ%ÿâÿ3´+3´)‹L$3´(3´*‹Ah1Û‹Ql1ð1É1ò%üüüüâÏÏÏψÈáÁÊ3<+ˆÓ3¼)ˆñÁè3¼+ˆãÁê3¼)ˆñ%ÿâÿ3¼+3¼)‹L$3¼(3¼*‹A`1Û‹Qd1ø1É1ú%üüüüâÏÏÏψÈáÁÊ34+ˆÓ3´)ˆñÁè3´+ˆãÁê3´)ˆñ%ÿâÿ3´+3´)‹L$3´(3´*‹AX1Û‹Q\1ð1É1ò%üüüüâÏÏÏψÈáÁÊ3<+ˆÓ3¼)ˆñÁè3¼+ˆãÁê3¼)ˆñ%ÿâÿ3¼+3¼)‹L$3¼(3¼*‹AP1Û‹QT1ø1É1ú%üüüüâÏÏÏψÈáÁÊ34+ˆÓ3´)ˆñÁè3´+ˆãÁê3´)ˆñ%ÿâÿ3´+3´)‹L$3´(3´*‹AH1Û‹QL1ð1É1ò%üüüüâÏÏÏψÈáÁÊ3<+ˆÓ3¼)ˆñÁè3¼+ˆãÁê3¼)ˆñ%ÿâÿ3¼+3¼)‹L$3¼(3¼*‹A@1Û‹QD1ø1É1ú%üüüüâÏÏÏψÈáÁÊ34+ˆÓ3´)ˆñÁè3´+ˆãÁê3´)ˆñ%ÿâÿ3´+3´)‹L$3´(3´*‹A81Û‹Q<1ð1É1ò%üüüüâÏÏÏψÈáÁÊ3<+ˆÓ3¼)ˆñÁè3¼+ˆãÁê3¼)ˆñ%ÿâÿ3¼+3¼)‹L$3¼(3¼*‹A01Û‹Q41ø1É1ú%üüüüâÏÏÏψÈáÁÊ34+ˆÓ3´)ˆñÁè3´+ˆãÁê3´)ˆñ%ÿâÿ3´+3´)‹L$3´(3´*‹A(1Û‹Q,1ð1É1ò%üüüüâÏÏÏψÈáÁÊ3<+ˆÓ3¼)ˆñÁè3¼+ˆãÁê3¼)ˆñ%ÿâÿ3¼+3¼)‹L$3¼(3¼*‹A 1Û‹Q$1ø1É1ú%üüüüâÏÏÏψÈáÁÊ34+ˆÓ3´)ˆñÁè3´+ˆãÁê3´)ˆñ%ÿâÿ3´+3´)‹L$3´(3´*‹A1Û‹Q1ð1É1ò%üüüüâÏÏÏψÈáÁÊ3<+ˆÓ3¼)ˆñÁè3¼+ˆãÁê3¼)ˆñ%ÿâÿ3¼+3¼)‹L$3¼(3¼*‹A1Û‹Q1ø1É1ú%üüüüâÏÏÏψÈáÁÊ34+ˆÓ3´)ˆñÁè3´+ˆãÁê3´)ˆñ%ÿâÿ3´+3´)‹L$3´(3´*‹A1Û‹Q 1ð1É1ò%üüüüâÏÏÏψÈáÁÊ3<+ˆÓ3¼)ˆñÁè3¼+ˆãÁê3¼)ˆñ%ÿâÿ3¼+3¼)‹L$3¼(3¼*‹1Û‹Q1ø1É1ú%üüüüâÏÏÏψÈáÁÊ34+ˆÓ3´)ˆñÁè3´+ˆãÁê3´)ˆñ%ÿâÿ3´+3´)‹L$3´(3´*ÁÏ‹D$ÁΉ8‰p][_^ÃS‹\$UVW‹;‹sì Áljú1÷çðððð1ú1þÁƉ÷1Öæðÿ1÷1òÁljþ1×ç33331þ1úÁ‰×1òâüü1×1ÖÁÇ ‰ú1÷窪ªª1ú1þÁÊÁΉs‹D$$‰‹|$(‹t$,ÇD$‰D$‰$èñÿÿÇD$‰|$‰$èóðÿÿÇD$‰t$‰$èßðÿÿÄ ‹;‹sÁÆÁljø1÷窪ªª1ø1þÁÀ‰Ç1ð%üü1Ç1ÆÁÇ ‰ø1÷ç33331ø1þÁƉ÷1Ææðÿ1÷1ðÁÇ ‰þ1Ççðððð1þ1øÁȉ‰s_^][ÃS‹\$UVW‹;‹sì Áljú1÷çðððð1ú1þÁƉ÷1Öæðÿ1÷1òÁljþ1×ç33331þ1úÁ‰×1òâüü1×1ÖÁÇ ‰ú1÷窪ªª1ú1þÁÊÁΉs‹t$$‰‹|$(‹D$,ÇD$‰D$‰$èÝïÿÿÇD$‰|$‰$èÉïÿÿÇD$‰t$‰$èµïÿÿÄ ‹;‹sÁÆÁljø1÷窪ªª1ø1þÁÀ‰Ç1ð%üü1Ç1ÆÁÇ ‰ø1÷ç33331ø1þÁƉ÷1Ææðÿ1÷1ðÁÇ ‰þ1Ççðððð1þ1øÁȉ‰s_^][ÃUSVW‹l$‹\$$‹3‹{WVWV‰ã‹t$$‹|$(‹L$8Q‹D$4PSù„·åøÿÿÿ‹D$ ‹\$„;‹‹V1È1Ó‰D$ ‰\$èâßÿÿ‹D$ ‹\$‰‰_ÆÇí…Åÿÿÿ‹l$8å„ èZŠ/‹,©Õ1É1ÒÿåŠvÁâŠvŠV‹é ŠnÁáŠnŠ1È1Ó‰D$ ‰\$ègßÿÿ‹D$ ‹\$‰‰_éÈåøÿÿÿ‹D$‹\$„P‹‹^‰D$ ‰\$è/ßÿÿ‹D$ ‹\$‹L$‹T$1Á1Ú‹‹^‰‰W‰D$‰\$ÆÇí…°ÿÿÿ‹l$8å„T‹‹^‰D$ ‰\$èÏÞÿÿ‹D$ ‹\$‹L$‹T$1Á1Ú‹‹^ÁʈWÁêˆwˆW‰éÁɈOÁáˆnˆé‹L$@ĉ‰Y_^[]Ã.+%USVW‹l$‹\$,‹3‹{WVWV‰ã‹t$$‹|$(‹L$@‹D$8P‹D$8P‹D$8PSù„·åøÿÿÿ‹D$‹\$„;‹‹V1È1Ó‰D$‰\$èZûÿÿ‹D$‹\$‰‰_ÆÇí…Åÿÿÿ‹l$<å„ èZŠ/‹,©Õ1É1ÒÿåŠvÁâŠvŠV‹é ŠnÁáŠnŠ1È1Ó‰D$‰\$èßúÿÿ‹D$‹\$‰‰_éÈåøÿÿÿ‹D$‹\$„P‹‹^‰D$‰\$èÑûÿÿ‹D$‹\$‹L$‹T$1Á1Ú‹‹^‰‰W‰D$‰\$ÆÇí…°ÿÿÿ‹l$<å„T‹‹^‰D$‰\$èqûÿÿ‹D$‹\$‹L$‹T$1Á1Ú‹‹^ÁʈWÁêˆwˆW‰éÁɈOÁáˆnˆé‹L$LÄ ‰‰Y_^[]Ã.+%ÌÌÌÌÌÌÌVWjFhLoFj@è Õþÿ‹ð3ÿƒÄ ;÷ujIhLoFjAjlj èÃþÿƒÄ3À_^ÃS^8U‹l$S¸VW‰.‰~‰~‰~ ‰F‰~‰~‰~‰~ ‰~(‰~$‰F,‰~0‰~4èlŸÿÿ‹EƒÄ ;ÇtVÿЃÄ…ÀuSVWèÀŸÿÿVè×þÿƒÄ3ö][‹Æ_^ÃV‹t$…öu3À^ÃjuhLoFjF,jÿPèOÿÿƒÄ…ÀC‹F…ÀtjjjjjVÿЃÄ…À~-N8QVjèQŸÿÿ‹ƒÄ …Àt‹@ …Àt VÿÐVè˜ÖþÿƒÄ¸^ÃSUV‹t$…öWtn‹…Àth‹H …Éta‹~‹\$‹l$…ÿtjjSUjVÿ׃Ä…À~]‹F …Àuh¢hLoFjxë7‹SUVÿP ƒÄ …À~F0…ÿt2PjSUh‚Vÿ׃Ä_^][Ãh—hLoFjyjoj èqÁþÿƒÄ¸þÿÿÿ_^][ÃSUV‹t$…öWu_^]3À[Ë‹~…Àte‹H…Ét^‹\$‹l$…ÿtjjSUjVÿ׃Ä…À~]‹F …ÀuhÅhLoFjxë7‹SUVÿPƒÄ …À~F4…ÿt2PjSUhƒVÿ׃Ä_^][Ãh»hLoFjyjqj èÊÀþÿƒÄ¸þÿÿÿ_^][ÃSV‹t$ W…ötj‹…Àtd‹H…Ét]‹~‹\$…ÿtjjjSjVÿ׃Ä…À~\‹F …ÀuhæhLoFjxë6‹SVÿPƒÄ…À~F4…ÿt2PjjSh„Vÿ׃Ä_^[ÃhÚhLoFjyjnj è&ÀþÿƒÄ¸þÿÿÿ_^[ÃSUV‹t$…öWtg‹…Àta‹H…ÉtZ‹~‹\$‹l$…ÿtjjSUjVÿ׃Ä…À~V‹F …ÀuhhLoFjxë0‹SUVÿPƒÄ …ÿt2PjSUh…Vÿ׃Ä_^][ÃhûhLoFjyjhj 舿þÿƒÄ¸þÿÿÿ_^][ËD$SUV‹t$W…ö‰D$ u_^]3À[Ë…ÀtW‹H…ÉtP‹~‹\$‹l$…ÿtjSL$(UQjVÿ׃Ä…À~I‹D$ PSUVÿRƒÄ…ÿt5PSL$(UQh†Vÿ׃Ä_^][Ãh:hLoFjyjgj èã¾þÿƒÄ¸þÿÿÿ_^][ÃSUV‹t$…öWu_^]3À[Ë…ÀtW‹H…ÉtP‹~‹\$ ‹l$…ÿt‹D$jUPSjVÿ׃Ä…À~I‹T$‹SURVÿQƒÄ…ÿt5P‹D$UPSh†Vÿ׃Ä_^][Ãh:hLoFjyjgj èK¾þÿƒÄ¸þÿÿÿ_^][ÃSV‹t$ W…öu_^3À[Ë…ÀtS‹H$…ÉtL‹~‹\$…ÿtjjD$ SPjVÿ׃Ä…À~H‹T$‹RSVÿQ$ƒÄ …ÿt5PjD$ SPh†Vÿ׃Ä_^[ÃhUhLoFjyjgj è±½þÿƒÄ¸þÿÿÿ_^[ÃV‹t$…öu‹D$ ^ËN$‹Æ…Ét ‹Á‹H$…Éu÷‹L$ …ɉH$t‰A(‹W…ÀtL‹H…ÉtE‹~…ÿtjjjjjVÿ׃Ä…À~B‹jjjVÿPƒÄ…ÿt/Pjjjh†Vÿ׃Ä‹Æ_^Ãh:hLoFjyjgj è ½þÿƒÄ‹Æ_^ÃV‹t$…öu3À^ËU‹n$W…ÀtI‹H…ÉtB‹~…ÿtjjjjjVÿ׃Ä…À~?‹jjjVÿPƒÄ…ÿt,Pjjjh†Vÿ׃Äëh:hLoFjyjgj 芼þÿƒÄ‹F(…Àt‹N$‰H$‹F$…Àt‹V(‰P(‹Å_ÇF$ÇF(]^ËD$‹@ÃSVW‹|$…ÿts‹_,‹÷G,‹$…öt[juhLoFjjÿPèÿÿƒÄ…ÀC‹F…ÀtjjjjjVÿЃÄ…À~(F8PVjè™ÿÿ‹ƒÄ …Àt‹@ …Àt VÿÐVèNÐþÿƒÄƒû…ÿu_^[ËD$V‹H$‹p‹Qƒâ ò‰p‹I‰H^ÃS‹\$VW‹|$WSÿÐF‹ðƒÄ…öuvjhh„oFÿPFPjjè]»þÿh€oFWh|oFShtoFjè•ÃþÿƒÄ,ÿøFƒ8ujkh„oFh€jmj è"»þÿƒÄ3À_^[Ãjmh„oFjjmj è»þÿƒÄ3À_^[Ãh€¦IèÄ÷ÿÿ‹øƒÄ…ÿu_^[ÃVjjjWè üÿÿƒÄ‹Ç_^[ø€¦IËD$3ɉH ‰H‰H ¸ÃV‹t$…öu3À^ËF…Àt&‹F …Àt‹F …ÀtPÿÜFƒÄÇF ÇF ¸^ÃV‹t$3À‹N …Étb‹L$ …ÉtZ‹F ‹T$PRjQÿÔFƒÄ…ÀuA‹N öA t8h§h„oFÿPFPj jèþ¹þÿh¨h„oFjh‚j èæ¹þÿƒÄ(ƒÈÿ^ËL$VW3ÿ‹A …Àt#‹D$…Àt‹I ‹t$QjVPÿÈFƒÄ…À‹Æu‹Ç_^ËL$S‹\$UVqÿ‹C þ„½‡ü3ÒŠ–H!Cÿ$•!C‹L$jQPÿ€FƒÄ ‹è^][Ëh ^ƒå‹Å][ÃPÿˆFƒÄ‹è^][Ã3ö;Þt9st9s t;Æt PÿÜFƒÄ‰s ‰s ‹D$‹L$‹Ð‰K #Õ‰k ¨‰Sth@Qÿ´FƒÄPÿXFƒÄ‹Å^][Ãh€Qÿ´FƒÄPÿXFƒÄ‹Å^][Ã3ö;Þt9st9s t;Æt PÿÜFƒÄ‰s ‰s ‹D$‹È#ͨ‰Kt%¨tf‹ oFŠ ¢oFf‰T$ˆL$ëRf‹@ÕHëD‹Èƒát¨t*f‹ œoFŠžoFf‰L$ˆT$ë&¨tf‹ @ÒHf‰L$ë;΄Âf‹ÔÒHf‰T$WT$¨¿$ÕHt¿˜ÒHƒÉÿ3Àò®÷Ñ+ù‹÷‹ú‹ÑƒÉÿò®‹ÊOÁéó¥‹ÊD$ƒáPó¤‹t$$VÿÐFƒÄ…À_uVhh„oFÿPFPjj覷þÿL$$h€oFQh|oFVhtoFjèÚ¿þÿhh„oFjjtj èu·þÿƒÄ@3í‹Å^][ÉC ‹Å^ÇC ][Ãhh„oFjejtj èE·þÿƒÄ3í‹Å^][ËL$…Ét‰‹Å^][Ëk^‹Å][ËT$‹Å^‰S][ÃPÿÄFƒÄ‹Å^][ÃÁCØCäCö Cÿ C !C° CôCæ CoC® C    ‹D$‹T$ VW‹|$3öÆ‹H QRWÿðFŠƒÄ „ÀtƒÉÿ3Àò®÷ÑI_‹Á^ËÆ_^ËT$VW‹úƒÉÿ3Àò®‹D$ 3ÿ÷ÑI‹ñ‹H …Ét…Òt‹@ PjVRÿÈFƒÄ…À‹Æu‹Ç_^ËD$PhüJè1ƒÄËL$‹A…Àt‹T$RT$jRQÿЃÄ…Àt‹D$Ãh€h¤oFh“hºj&è_µþÿƒÄ3Àø,èÆSUVW‹|$T3Û3íÇD$öG<@t1‹G‹@,;Ãt'‹L$P‹T$LWQ‹L$PR‹T$PQ‹L$PRQÿЃÄ_^][ƒÄ,ËD$@ƒøru8‹D$H¾$;Æt"jWhÀoFhƒjujèдþÿƒÄ3À_^][ƒÄ,Ë\$DéŸT$$P‰T$èŒ%ÿÿ‹L$ƒÄ‰‹L$‹;ÃujahÀoFjujuj致þÿƒÄ3À_^][ƒÄ,Ã9X ujfhÀoFjtjujèc´þÿƒÄ3À_^][ƒÄ,ÃT$ÇD$‰\$ D$,‰Q‹L$D‹T$H‰D$D$SP‰L$<‰T$4è HƒÄ‹ðWèÅ«ÿÿHõƒÄ;ñ‰D$D~jvhÀoFjpjujèõ³þÿƒÄ3À_^][ƒÄ,Ã|$@rtNjz@hÀoFPèÓÅþÿ‹èƒÄ …íuj}hÀoFjAjuj踳þÿƒÄ3À_^][ƒÄ,ÃT$TD$RP‰l$\èHƒÄ‹Ý‹L$LjWQSVè„«ÿÿƒÄ…À3öë ‹T$P‹t$‰ƒ|$@rt‹D$D@PUè¼SÿÿUèÖÇþÿƒÄ ‹Æ_^][ƒÄ,øè¶SUV‹t$(WVÇD$èЪÿÿ‹\$,ƒÄ;Øt hšhÀoFjwjwjè³þÿƒÄ3À_^][YÃöF<@t+‹F‹@0…Àt!‹L$$‹T$ VSQ‹L$(R‹T$(QRÿЃÄ_^][YÃh¤hÀoFSè´Äþÿ‹èƒÄ …íuh§hÀoFjAjwjè–²þÿƒÄéA‹|$ƒÿru*ƒ|$ $t#h«hÀoFhƒjwjèf²þÿƒÄ3À_^][YËD$$jVUPSè|ªÿÿƒÄ…ÀŽôƒÿru@ƒø$u‹|$¹ ‹õ3Òó§u ÇD$éÌhµhÀoFjhjwjè²þÿƒÄé¯PD$0Pj‰l$8èKF‹ØƒÄ …Û„‹ ‹Rè”$ÿÿƒÄ;Çt9ƒÿuƒøthÓhÀoFjdëOƒÿuíƒøuè¡”FhØoFƒÀ@Pÿ,FƒÄ‹C‹L$ 9u‹x‹t$3Òó¦u ÇD$ëhÚhÀoFjhjwjè]±þÿƒÄSèôEƒÄ‹\$(SUè¦QÿÿUèÀÅþÿ‹D$ƒÄ _^][Yø8pFËD$h8pFPè±|ÿÿƒÄÃV‹t$ D$‹PQhtpFèz‹FT$RPhhpFè†}‹D$(ƒÄ^øè6SUVWh8pFè8uÿÿ‹ðƒÄ…ö‰t$ujhh”pFjAjfj"艰þÿƒÄ3À_^][YËD$ 3ÛPè"ûþÿƒÄ…ÀŽÂ‹L$ SQèûþÿ‹èƒÄ¾tpF‹}‹ÇŠŠÊ:u„ÉtŠPŠÊ:VuƒÀƒÆ„Éuà3ÀëÀƒØÿ…Àu‹D$PUè~ƒÄ…À„¤ëI¾hpF‹ÇŠŠÊ:u„ÉtŠPŠÊ:VuƒÀƒÆ„Éuà3ÀëÀƒØÿ…Àu7‹D$ƒÀPUèƒÄ…ÀtY‹L$ CQèdúþÿƒÄ;ØŒBÿÿÿ‹t$‹Æ_^][YÃjrh”pFjjjfj"苯þÿ‹U‹E‹MRhŒpFPh„pFQhxpFjè¹·þÿƒÄ0‹T$h8pFRè÷zÿÿƒÄ3À_^][YËD$‹L$PQè!ôþÿƒÄøè–SUV‹t$3íÆD$…ö„‹V…Ò„‹^‹ã…Àu º‰T$ëR3ɉD$Š …Ûuƒù~5½ˆ\$ë*ù€u ¹;Á~€< uA;È|õë ½ÆD$ÿ‹D$ʼnD$‹Ð‹D$…Àu^]‹Â[YÃW‹8…ítŠL$ˆG‹…Éuˆ‹Ê_^‰]‹Â[YÃ…Ûu‹v‹ÙÁéó¥‹Ëƒáó¤‹_Ê^‰]‹Â[YËVtÿŠ\ ÿT ÿ„Ûu ÆŠZÿNJI„ÛtóŠöÓþÈNJI…É~ ŠNöÓˆ^JIuô‹T$‹Ê_^‰]‹Â[YÃ^]3À[YøèFSUVW‹|$…ÿt‹/…íujèòþÿ‹èƒÄ…íu_^][YÃÇE‹D$‹\$ h²h°pF‹0SR ‰L$ès¿þÿƒÄ ‰D$ …Àu8hîh°pFjAh’j èP­þÿƒÄ…ít…ÿt9/t UèûñþÿƒÄ_^]3À[YÃ…Ûu ÇEé•ö€tfÇEŠ<ÿuƒûtFK‹L$ ŠTÿDÿ‹û„Òtÿu…ÿtÆŠPÿNOH„Òtï…ÿu ÆÆCëCŠöÑþÁˆNHO…ÿ~4ŠNöÒˆVHOuôë&ÇEŠ„ÉuƒûtFK‹Ë‹ø‹ÁÁéó¥‹Èƒáó¤‹|$‹E…Àt PèþÀþÿƒÄ‹L$ ‰]…ÿ‰Mt‰/‹D$‹T$_^‰‹Å][YøèÆV‹t$‹ÇFƒøs2‹F…Àt Pè¦ÀþÿƒÄhEh°pFjè¾þÿƒÄ ‰F…Àt3ɉˆH‹F…ÀuhJh°pFjAjvj èå«þÿƒÄ3À^ƒÄËL$…É} ÷ÙÇF3À…Ét ˆLÁù@ƒørï3ÉH…À|S‹VŠ\ˆ AHyò[‰¸^ƒÄËL$U3í3ÀVW…Éu_^]ËQúu½‹1ƒþv_^ƒÈÿ]Ãútí_^ƒÈÿ]Ëy…ÿu_^3À]Ã3É…ö~3ÒŠÁà ÂA;Î|ñ…ít÷Ø_^]ÃS‹\$ VW…Ûujè~ïþÿƒÄ‹ðë‹ó…öuh‰h°pFj:ëb‹|$‹G …Àt ÇFëÇFWè‚AÿÿƒÄ…Àt ™ƒâÂÁø@‹ƒÀ;È}Lh’h°pFP‹FPè$½þÿƒÄ…Àu.h•h°pFjAh‹j è…ªþÿƒÄ;ót Vè8ïþÿƒÄ_^3À[ÉF‹NQWè²GÿÿƒÄ‰…Àu ‹VˆÇ‹Æ_^[ËD$VW‹|$ P‹‹WQRè Fÿÿ‹ðƒÄ …öuh¬h°pFjijwj è ªþÿƒÄ‹Æ_^ÃuÇF ‹Æ_^ËD$ ‹L$‹T$PQRè,íþÿƒÄ ËD$…ÀuFjFh8sFj誻þÿ‹L$ƒÄ ÇÇ@…À‰t¸ÃjKh8sFjAjrj èx©þÿƒÄ3ÀøËD$ ‹L$‹T$hqFPQRè×LÿÿƒÄËD$‹L$hqFPQèlbÿÿƒÄ ÃhqFè¦mÿÿƒÄËD$hqFPè¡tÿÿƒÄËD$…Àuè#›ÿÿ‹L$‰÷ØÀƒàÃøuV‹t$ ‹RèsœÿÿƒÄǸ^øËD$ ‹L$‹T$h¸qFPQRèLÿÿƒÄËD$ ‹L$‹T$h0rFPQRè÷KÿÿƒÄø rFËD$ ‹L$‹T$hsFPQRèÇKÿÿƒÄÃVW‹|$…ÿt‹7…öu(èKÏþÿ‹ð…öujQhPsFjh›j è¨þÿƒÄ3À_^ËD$ P‰FèûÐþÿƒÄƒø‰t2ƒøttjphPsFh£ëC‹D$‹L$PQjèmÿÿÿƒÄ ‰F …ÀuQjjë‹T$‹D$RPjèN;ƒÄ ‰F …Àu2j`hPsFj h›j è§þÿƒÄ…öt…ÿt97t Vè*ÑþÿƒÄ_3À^Ã…ÿt‰7‹Æ_^ËD$‹T$‹H‹‹ËD$ ‹T$‹H‹‹T$È‹‰ËD$ €8uD‹H…Ét=öAt7‹T$‹AV‹2‹T$ Æ^…Òu ǸËI jqhhsFQRPè·üþÿƒÄÃ3ÀËD$…Àt4‹…Ét.‹D$‹@…Àt#ö@t‹@Á…ÀtÇÇ@Ç@ËD$V…ÀtC‹…Ét=‹D$ ‹@…Àt2ö@t,‹pñ…öt#‹…Àt Pè˺þÿƒÄÇÇFÇF^ËD$S…ÀUt ‹…Ét‹D$‹@…Àtö@t ‹XÙ…Ûu]¸[Ë…Àt PèrºþÿƒÄ‹l$h£hhsFUèÛ·þÿƒÄ ‰…Àu][ËÍV‹t$‹ÑW‹;Áéó¥‹Ê¸ƒáó¤_‰k^ÇC][ËD$ …Àtf‹…Ét`‹D$‹@…ÀtUö@tO‹@Á…ÀtF‹H…Éu?‹T$…Òt$‹HSV‹0‹ÙW‹:Áéó¥‹Ëƒáó¤‹H‹2ñ_‰2^[‹L$…Ét‹P‰¸Ã3ÀËD$‹öÅt‹D$ËL$‹@ÃV‹t$ W‹öÄu‹Æ_^ÃÿV‹L$ ‹ø‹G‹Âu ‹G…Àt>_^ËöÅt ‹Rèƒÿÿë‹Pè)ùÿÿ‹w‹W ƒÄ3É…ö~ 9t7AƒÂ;Î|ô‹G…Àu%‹D$…ÀthûhhsFh¤jnj èw¤þÿƒÄ3À_^Ã_^BÃSV‹t$ …öu^3À[Ë…Û~u‹F ¨tƒàëk‹NDÿ€8uKH…Ûõ3ÀŠDÿ¨uM¨t¸ëD¨t¸ë9¨t¸ë.¨t¸ë#¨ t¸ë¨@t¸ë $€öØÀƒàë3À‹L$S…ɉT$ u^‹Â[Ë‹ËU‹éˆ‹vBW‹úÓÁéó¥‹Íƒáó¤_]…Û~€Ëÿ‹ÈŠBÿÒã"ÈBÿ‹D$^[‰‹D$øèö SU‹l$3ÛVƒýW} ‹|$¸˜ëu‹|$…ÿt‹…Ûujè·çþÿ‹ØƒÄ…Ûu_^][ƒÄËD$ ‹K ƒáø‹Õ‹03ÀŠF‰D$ƒà Á‰t$$ Mƒú‰C Žh’h„sFUè÷´þÿƒÄ ‰D$…Àu>¸Ah§h„sFPhj èТþÿƒÄ…Ût…ÿt9t Sè{çþÿƒÄ_^]3À[ƒÄË͋ø‹ÑÁéó¥‹Ê€Êÿƒáó¤‹L$‹|$ÒâŠL(ÿ"ʈL(ÿ‹L$$͉L$$‹ñë ÇD$‹D$‹K‰+…Ét‹ÁPèÚ¶þÿ‹D$ƒÄ…ÿ‰CÇCt‰‹L$ _‹Ã‰1^][ƒÄÃSUV‹t$‹Æƒæ™ƒâ¹Â+΋è¸ÓàW‹|$Áý…ÿ‹Ø‰D$÷Óu‰|$‹Ç‹t$‹V ƒâð…ö‰V u_^]3À[ËM;Ñ|ƒ~uw…ÿ„–‹F…ÀuhÀh„sFQ讳þÿƒÄ ëhÄh„sFQRPè÷´þÿƒÄ‹Ð…Ò‰T$u_^][Ë>‹Å+ÇH…É~ú‹Ñ3ÀÁéó«‹Ê‹T$ƒáóªE‰V‰‹D$‹Né"] ؈]‹…À~‹N‹ŠTÿ„ÒuH…À‰ï_^]¸[ÃV‹t$ ‹Æ‹L$™ƒâWÂÁø…Ét1‹9P;ú|(‹y…ÿt!Šƒæ¹º+Î_Óâ^"ÐöÚÒ÷Ú‹ÂÃ_3À^ËD$‹H…Ét%D$jPè©pÿÿ‹L$ ‹T$‹D$ƒÄ‰‹L$‰AËT$‰‹L$‹D$ ‰AÃS‹\$ UV‹t$W…ö„q‹|$‹Gð;ÐsÿG‹O‹ÆÁèȉW‰O‹O\…É„ºG‹é‰D$‹Á΃àÁýƒù@‚3‹L$ƒø‹©w+ÿ$…L:C‹\$3ÒŠÁâC3ÀŠÁà ÐC3ÀŠ# ÐC3ÀŠ ÐC‰©Eƒý}D¸ ©+ʼnD$3À3ÒŠŠSÁàCƒÁÁâ ÂC3ÒŠ3 ÂC3ÒŠ ÂC‰Aü‹D$H‰D$u΋L$jQWèkŽ‹G\ƒÄ ÇG\tÀ‹îÁí…í~USWöÃèB}ÁåƒÄ Ý+õ…öti‹Æ‰w\Áèƒæo…Àt-‹ø3À3ÒŠŠSÁàC3ÉÁâŠk ÂC ÁC3҃Ŋ ÂC‰EüOuÕ‹Æ3ÉÞHtHtHuŠkÿKK3ÀŠÁà È3ÒŠSÿÁâ ʉM_^]¸[ÉO\<0ƒÿsP‹|$ƒè‹ ¯tHtHt+‰ ¯_^]¸[Ë\$3ÉŠ ÁáCNt3ÒŠÁâ ÊCN…öt3ÀŠ# ȉ ¯_^]¸[ËñƒáÁþ…Àt‹T$‹ªƒøw+ÿ$…\:C‹\$3ÒŠÁâC3ÀŠÁà ÐC3ÀŠ# ÐC3ÀŠ ÐC‹|$E;î‰T¯ü}1+õ<¯î3À3ÒŠŠSÁàCƒÇÁâ ÂC3ÒŠ3 ÂC3ÒŠ ÂC‰GüNuÖ…É„ÿÿÿ‹Ñ3ÀÙJtJtJuŠcÿKK3ÉŠ Áá Á3ÒŠSÿÁâ ‹L$_^‰©]¸[Ã8C8C%8C,8C©9Cµ9C¿9CÆ9CSUV‹t$W½ sF‹N\^‹ÁÁøƒáu3ÿë‹<ƒƒùw5ÿ$Ä;C‹= sF½¡sFçÿÁç3ÉŠMÁá ùE3ÒŠu úE3ÉŠM ù‰<ƒ@ƒø~ƒø}ǃjSVèŒƒÄ 3Àë}¹<ƒ+È3Àó«‹Vj‰S8‹FSV‰C<èÜ‹‹‹D$ ‹ÑƒÄ ÁꈋÑ@ÁꈋÑ@Áêˆ@ˆ‹N‹Ñ@ÁꈋÑ@ÁꈋÑ@Áêˆ@ˆ‹N‹Ñ@ÁꈋÑ@ÁꈋÑ@Áêˆ@ˆ‹N ‹Ñ@ÁꈋÑ@ÁꈋÑ@Áêˆ@ˆ‹N‹Ñ@ÁꈋÑ@ÁꈋÑ@ÁꈈHÇF\_^]¸[à:C´:C¿:CÇ:C‹D$3ÉÇ#EgÇ@‰«ÍïÇ@þܺ˜Ç@ vT2Ç@ðáÒÉH‰H‰H\¸ÃV‹t$…öujrhÌsFjCjlj&èå›þÿƒÄ3À^ËD$ …ÀtjvhÌsFjF@jÿPè²ñþÿƒÄë‹F@H‰F@…À"‹F …ÀtVÿЃÄNHQVj è¹xÿÿVè°þÿƒÄ¸^øèöVW‹|$3öƒ?u_3À^ƒÄÃh hèsFjj è>ðþÿ‹ƒÄ…À„Æ‹L$ T$RP‰L$èþúþÿ‹øƒÄ…ÿ„¦‹GU…ÀtP胂ÿÿƒÄ…Àt‹wé‹G …Àt‹wëu‹GjP½è¨åþÿ‹ðƒÄ…öt\‹FD…À öJu Vè9‚ÿÿƒÄ…Àu‹O‹ÅPQEèuåþÿ‹ðƒÄ…öuÍë'9wt"Vè‚ÿÿƒÄ…Àt‹G…Àt jPè9‚ÿÿƒÄ‰wÇG ]hdhèsFjj èXïþÿƒÄèP›þÿ‹Æ_^ƒÄøè¦Iø8è¶SUVD$W3ÛP‰\$‰\$3ÿÇD$ ‰\$èÐ1ÿÿL$8QèÆ1ÿÿ‹t$\ƒÄ9^ „C9^„:9^„1è¿1ÿÿ‹ø;û„*‹VRè|0ÿÿƒÀ‹l$T™ƒâƒÄÂÁø;èôƒý2ëès‹Ø…Û„î‹N 3Ò;Êt‹F$;Ât‰L$‰V ‰D$‰V$ëD$L$PQSVèØƒÄ…À„²‹D$LT$ RUPè-5ÿÿƒÄ …À„—‹N‹T$‹FSQRL$@PQ誌ƒÄ…ÀtxT$ D$4RPW胈ƒÄ …Àta‹NQWèb7ÿÿƒÄ…À~‹VRWWè@‹ƒÄ ‹F‹L$SPQWWè\ŒƒÄ…Àt*è°ïÿÿ…À‰D$t‹T$‰x‰ë=ÇD$dëÇD$e‹D$hŸhtFPjpj 蓘þÿ‹L$$Qè 0ÿÿWè0ÿÿƒÄ…Ût Sè–ƒÄT$ Rè‰/ÿÿD$8Pè/ÿÿ‹D$ƒÄ…À_^][t Pèj/ÿÿƒÄ‹D$ƒÄ8øè¦SV‹t$$W3Û3ÿ‹F ‰\$ ;ı9^„¨9^„ŸD$UPè¯/ÿÿ‹l$4ƒÄ;ëu 诋è…ítQè´/ÿÿ‹Ø…ÛtF‹NT$QR3ÿè!ƒÄ…Àt/‹D$…Àtƒø…‡‹D$ƒ8u~‹NT$QRèß ƒÄ…ÀuÑhàhtFjjkj ès—þÿƒÄ…ÿt Wè†.ÿÿƒÄ…Ût Sèy.ÿÿƒÄ‹D$0…Àu UèhƒÄ…ÿ]t WèZ.ÿÿƒÄT$RèM.ÿÿ‹D$ƒÄ_^[ƒÄËF,…Àu(öF(t"è“…À‰F,t‹N UQP蛓ƒÄ …À„hÿÿÿ‹F,‹N ‹V‹t$83ÿ‹…Àt Pè-ÿÿƒÄ‰ÇD$éÿÿÿh³htFjejkj èF–þÿƒÄ3À_^[ƒÄø<è¦ÿUV‹t$TƒÍÿ‹F …À„0‹F…À„%‹F…À„SD$ WPè°-ÿÿL$(Qè¦-ÿÿT$@Rèœ-ÿÿƒÄ 褋ø…ÿ„”‹\$X‹‹H…ɄӃùu ‹ƒ9„ËH …É…¸‹VRPè¤3ÿÿƒÄ…À£‹C‹H…É„•ƒùu ‹ƒ9„…‹H …É…z‹VRPèf3ÿÿƒÄ…Àe‹F‹KWPT$,QRèhƒÄ…À„÷‹L$T‹T$PD$PQRèù0ÿÿƒÄ …À„Ø‹FWL$(PT$QD$RPèuˆƒÄ…À„´‹N‹WT$(QRL$0PQèSˆƒÄ…À„’‹F,…Àu$öF(tèÆ…À‰F,t‹V WRPèD‘ƒÄ …Àtg‹F,‹V P‹N‹D$D‹L$HjjPQVSèc¥ƒÄë'‹T$D‹D$HRPVSè£ë‹L$D‹T$HQRVS誢ƒÄ…ÀŽ\D$PVSèÃ-ÿÿƒÄ …À„E‹OT$QRèÚ/ÿÿƒÄ…À|hhLtFh„é‹G@…À……öG<tè©‹è…í„ü‹D$‹OPQUè ŽƒÄ …ÀuUèÓƒÄ騋G@…Àu8h hLtFj j èAæþÿ‹G@ƒÄ…Àu‰o@3íh¦hLtFj j èæþÿƒÄ…ít U肃Ä‹G@‹L$‹WP‹GQ‹OPQD$(L$)ÿÿSèXþÿƒÄ ‹Æ_^][ƒÄ8ÃI„NC«NC»NC”NC¸0è&òSVWD$ƒÏÿP3ö‰|$3ÛèN ÿÿL$,QèD ÿÿƒÄèL…À‰D$„Ö‹|$LU‹WRèÿÿƒÀh™ƒâhLtF‹ðÁþVèDšþÿ‹ØƒÄ…ÛuhhLtFjAér‹D$D;Æ~h hLtFjléY‹T$HL$QPRèá#ÿÿƒÄ …À„J‹GL$PQèø%ÿÿƒÄ…À|hhLtFh„é‹G@…À……öG<tèǃ‹è…í„‹T$‹GRPUè>„ƒÄ …ÀuUèñƒƒÄéÝ‹G@…Àu8h%hLtFj j è_Üþÿ‹G@ƒÄ…Àu‰o@3íh+hLtFj j è=ÜþÿƒÄ…ít Uè ƒƒÄ‹W@‹D$‹OR‹WP‹GRPT$(D$‚ƒÄéÛ‹FD…Àu8hkhLtFj j è¬Úþÿ‹FDƒÄ…Àu‰~D3ÿhqhLtFj j èŠÚþÿƒÄ…ÿt WèíƒÄ‹FH…Àu{莋ø…ÿ„y‹N SQWè ‚ƒÄ …ÀuW較ÄéY‹FH…Àu8hƒhLtFj j è*Úþÿ‹FHƒÄ…Àu‰~H3ÿh‰hLtFj j èÚþÿƒÄ…ÿt WèkƒÄ‹V ‹l$XSRD$0UPjè‚yƒÄ…À„ì‹VH‹F ‹NR‹V(SPRD$8T$LPRÿQƒÄ…À„Ä‹FSPL$0UQjè=yƒÄ…À„§‹FD‹N‹|$T‹VP‹F$SQL$4PQWÿRƒÄ…À„T$€þÿƒÄ_^3À[ÃjIh€tFhÀè’þÿ‹ÐƒÄ …ÒujLh€tFjAjjjè€þÿƒÄ3ÀÃW¹°3À‹úó«Ç‚„‹Â_ÃS‹\$…Ût.VWs¿ VèçÿÿƒÄƒÆOuñŠƒ„_¨^t Sè,”þÿƒÄ[ËD$‹ˆˆƒù } ‹‰”ˆŒÿ€ˆÃV‹t$ƒ¾ˆ ‹ƒù } ‰A‰D†^ˆ¼…Àu"h„h€tFjmjtjè@þÿƒÄdž¼3À^ËD$…ÀtD‹ˆˆ…Éu‹‰ˆŒ‹ˆˆA‰ˆˆ‹ˆˆÇ€¼Iƒù ‰ˆˆ} ‹”ˆŒ‰øèFèSUVW‹|$83ÀW‰D$ ‰D$$èÿÿÿWè(ÿÿÿW‰D$èÿÿÿW‹ðèÿÿÿW‰D$(è ÿÿÿW‹èèÿÿÿW‹Øèüþÿÿ‹ø‹D$TP‰|$8èìþÿÿƒÄ ‰D$$…À‹D$,„x…Àuè0ÿÿ…À‰D$„c‹L$jQè˜ÿÿjWèÿÿ‹T$@RVè•ÿÿƒÄ…À„9‹D$4‹L$PQè{ÿÿƒÄ…À„‹T$ÇB ‹F …Àu‹ÂPVèõÿÿƒÄ…À|‹L$8‹T$QRVVèípƒÄ…À„á‹D$4ÇD$0ÿÿÿÿ‹H…ÉŽ™‹ö„Ž‹L$4QèFÿÿƒÄ=v‹F…À„‹l$ƒøu ‹ƒ:„î3ÛSVè ÿÿƒÄ…Àu^‹EC…À~‹Eöt‹L$4QUUèMmƒÄ …À„QUUèkŸƒÄ…À„?SVèÙÿÿƒÄ…Àt¹…Û~SVVèV¡ƒÄ …À„‹T$3ÛSRè®ÿÿƒÄ…Àue‹GC…À~‹öt‹L$4QWWèÜlƒÄ …À„àWWèúžƒÄ…À„΋T$SRèdÿÿƒÄ…Àt¶…Û~‹D$SPPèÝ ƒÄ …À„¡‹\$SVè‡ÿÿƒÄ…À|(WUUèxlƒÄ …À„|SVVè5mƒÄ …À„ië&UWWèPlƒÄ …À„TVSSè mƒÄ …À„A‹F…À…žþÿÿé—‹F…À„Œƒøu ‹ƒ8„tVè¡ÿÿ‹L$‹øQè•ÿÿƒÄ;Çu/jUè6ÿÿƒÄ…À„ê‹T$VRSènƒÄ …À„ÓéúVèYÿÿ‹ø‹D$PGèLÿÿƒÄ;Ç…¿‹|$$VWèƒÄ…À„š‹L$WQè€ÿÿƒÄ…À}/jUèÁÿÿƒÄ…À„u‹T$VRSèšmƒÄ …À„^é…‹D$WPSè~mƒÄ …À„BVWUè‹jƒÄ …À„/‹L$UQèÿÿƒÄ…À}jUèVÿÿƒÄ…À„ ë4jUèAÿÿƒÄ…À„õVSë‚‹T$8‹D$RVPSUèPoƒÄ…À„Ô‹E‹|$‰t$ƒø‹ó…À‹M9u'‹M …Éu ‹T$‹D$RPWèñiƒÄ …À„•éŃø…‰‹Mƒ9u‹M …Éu‹T$RWèÞ›ƒÄ…À„bë~ƒøu]‹Mƒ9u!‹M …Éu‹T$jRWè0ƒÄ …À„4ëPƒøu/‹D$PWèsÿÿƒÄ…À„‹M‹RWè<¡ƒÄ…À„ë‹D$8‹L$PQUWèÞ—ƒÄ…À„â‹T$RWWè'iƒÄ …À„Ë‹D$‹\$‹L$0‰D$‹F‰|$‹|$÷Ù…À‰L$0…|ýÿÿ‹D$0…À}‹T$4WRWè¿kƒÄ …À„ƒ‹D$ƒxua‹ƒ9uZ‹H …ÉuS‹G …Àu*‹T$4RWèJÿÿƒÄ…À}‹t$WVè˜ÿÿƒÄ…Àt@‰t$ ëO‹D$8‹L$4‹t$PQWVè&lƒÄ…Àt‰t$ ë-hâh˜tFjljnjèäxþÿƒÄ‹D$,…Àu ‹T$RèOÿÿƒÄ‹D$8Pè¢ùÿÿ‹D$$ƒÄ_^][ƒÄËD$‹L$ ‹T$P‹D$QRPjèƒÄø èâ‹L$ÇD$…Éu‹D$QPèËÿÿƒÄ¸ƒÄ ÃAS™ƒâUÂYÿ‹èVÁýã€yKƒËøCK¸ÿÓàh†h°tFU‰D$ è Šþÿ‹ðƒÄ …öu#h‰h°tFjAjrjèxþÿ‹D$ ƒÄ^][ƒÄ ÃL$WQÿÌFjjT$ jRèØ›þÿ‹|$4ƒÄ…ÿUVt@覜þÿƒÄƒøÿ„ÁƒÿuS3ÿ…í~MD$(jP胜þÿŠD$0ƒÄ<€r…ÿ~ŠL7ÿˆ 7ë$èö›þÿƒÄ…ÀŽ‚ë<*sÆ7ëÿÿƒÄ…À|0WVVèhƒÄ …À„–WVèÿÿƒÄ…À|WVVèþgƒÄ …ÀtyWVèÿÿƒÄ…À|IjjÿSVÿՃąÀu¥_^][Ë\$jjÿVSÿՃąÀtDWSèËÿÿƒÄ…À|jjÿVSÿՃąÀuã_^][Ã_^]¸[Ãhìh°tFjsjzjè1uþÿƒÄ_^]3À[ËD$‹L$PQjèþÿÿƒÄ ËD$P‹HDÿQƒÄËD$ ‹T$PR‹HD‹D$ PÿQƒÄ øH§Iø è6ÞSUVW3ÿ3Û‰|$‰|$èqôÿÿ‹t$ ‹è;ï‰l$„Æ‹~…ÿuèc ÿÿ‹ø…ÿ„°ÇD$‹^…ÛuèE ÿÿ‹Ø…Û„’‹F …Àu$öFtèYp…À‰F t‹NUQPè×pƒÄ …Àtg‹D$‹n …Àt&‹F…Àu ‹VRèÅ ÿÿƒÄHjjPWèVûÿÿƒÄ…Àt2‹L$‹V‹FDUQ‹N RWQSVÿP ƒÄ…Àt‹l$‰^‰~ÇD$ë‹l$h–hÜtFjjgjè´sþÿƒÄ…Ût‹F…Àu Sè ÿÿƒÄ…ÿt‹F…Àu Wè ÿÿƒÄUè£óÿÿ‹D$ƒÄ_^][ƒÄ ÃSUVWƒÍÿè4óÿÿ‹ø…ÿ„¬Wè´óÿÿWèÎóÿÿ‹t$$‹ØƒÄ‹F…Àuh¬hÜtFjdjfjè)sþÿƒÄëv‹F …Àu$öFtè"o…À‰F t‹NWQPè oƒÄ …ÀtK‹F ‹N‹VDP‹FWP‹D$$QPSVÿR ƒÄ…Àuh¹hÜtFjjfjèÃrþÿƒÄë‹L$QSèÿÿƒÄ‹èWèˆóÿÿWèÂòÿÿƒÄ‹Å_^][ËD$ ƒxu'‹L$‹T$‹Q‹L$R‹T$‹QRP‹D$P裃ÄËL$‹T$Q‹L$R‹T$QRP‹D$PèP{ƒÄËD$‹HƒÉ‰H¸ËD$‹@ …Àt Pè_nƒÄ¸áôtFPhJè`ÖÿÿƒÄËD$‹@øè6ÛSVD$ WPÇD$ƒËÿèÎñþÿ‹L$,‹RèRäþÿPè ãþÿPè|þÿ‹ðƒÄ…öu#hhøtFh¡h‰j èbqþÿƒÄ鵋D$$‹T$0L$ PQRè†*ÿÿ‹ø‹D$ƒÄ …Àuh•høtFjAh‰j è!qþÿƒÄëwjD$VPè_ñþÿ‹L$WT$ QRèòþÿ‹D$$WPèTÿÿ‹L$,Qèj…þÿ‹D$P‹T$XR‹‹PQD$PSè)PÿÿƒÄ…À„‹K‹T$HÎWQRè=­ÿÿƒÄ …À}‹L$…É„ø…À~ð‹{‹Æ+ÅL$,PT$,QD$8RL$$ýPQ‰|$,èm®þÿƒÄ‰D$$¨€tèpþÿ%ÿ=›…Ûè8pþÿ‹D$$‹T$+×ꨋD$t @‰D$éCÿÿÿ‹|$0…Àt…ÿu‹L$(…ÉuH…À‰D$Ž«éÿÿÿ‹Î+Í;ù~A+þý>RSèNOÿÿƒÄ…ÀtL…ÿ~ ‹C‹L$HÆWPQèb¬ÿÿƒÄ …À~>+øð…ÿà‹|$0‹D$ï…À~WéÉþÿÿh°h4wFjAë$h¶ëhçh4wFjAëhðh4wFhŽjkj ènþÿƒÄSèÜMÿÿƒÄƒÈÿ_^][ƒÄ4ËT$L_‹Å^‰][ƒÄ4øøwFø@xFøØxFÃ|$u‹D$‹‹QRèJ—þÿƒÄ¸ø yFøèyFøHzFÃ|$u‹D$‹‹QRè*ƒþÿƒÄ¸øÐzFø0{Føà{Fø(|Fø˜|FËD$…ÀuèÃaÿÿ‹L$‰÷ØÀƒàÃøuV‹t$ ‹Rè#cÿÿƒÄǸ^øËD$ ‹L$‹T$hèFPQRèÿÿƒÄËD$‹L$hèFPQèœ%ÿÿƒÄ ËD$ ‹L$‹T$hH€FPQRèÇÿÿƒÄËD$PhèFèAKÿÿƒÄøè†Õ‹D$‹T$L$PQRÇD$ è*%ÿÿ‹L$ ƒÄ …Éu3ÀYËT$ jR‹T$ R‹T$ RPQè#ïþÿ‹D$Pè9€þÿƒÄ¸YËD$ ‹L$‹T$h¨€FPQRèÿÿƒÄËD$‹L$h¨€FPQè¬$ÿÿƒÄ ËD$h¨€FPèñ6ÿÿƒÄÃ|$u‹D$‹‹H ‹A…Àt‹‹@RPè} ÿÿƒÄ¸ø8FËD$ ‹L$‹T$h8FPQRèwÿÿƒÄËD$h8FPèq6ÿÿƒÄø`è6ÔSUVW‹|$t3Û3í‰\$‹G ƒ8u‰ëÇ‹H‹Q‰T$t‹@‹0è°‘þÿ…À‰D$ujehxFjAjojèfjþÿƒÄ3À_^][ƒÄ`ËG‰D$‹Qè ÝþÿƒÄƒø„žƒøttohÔhxFjvjojè$jþÿ‹T$,ƒÄ‹…Àu¡˜]FŠ œ]F‰D$ ˆL$$ëPT$$jPRèõMÿÿƒÄ D$ Ph]Fjè1rþÿ‹L$Qè—“þÿƒÄ3À_^][ƒÄ`ËD$t€80…•hðzBh zBVPèL“‹ØƒÄ…Ûu hé´SèC´þÿƒÄƒøt h…éœjSè9´þÿjS‹ðè/´þÿ‹ƒÄƒùu Ç‹Îë‹L$‹Qƒ:uÇ‹Iƒ8t h›éR‹pë0h–éCD$tVPjèû ÿÿ‹ðƒÄ …öu h¡é#‹O‹I…É„ƒ9…‹Q‹B‰D$t‰D$‹AL$‹PQjèQÀÿÿ‹èƒÄ …íu h­éÙjVèv¾ÿÿƒÄ‰E…Àuh²hxFjpé½èvÿÿ…À‰Euh·hxFjAé èIèÿÿ‹ø…ÿ‰|$uh»hxFjA逋U ‹E‹MWR‹UPQRè8mƒÄ…ÀuhÂhxFjqëU‹D$UjtPè¦þÿWè@èÿÿƒÄ…ÛthðzBSè>²þÿ‹D$ƒÄ_^][ƒÄ`ÃVè ÿÿ‹D$ƒÄ_^][ƒÄ`Ãh§hxFjrjojèÕgþÿ‹L$0ƒÄQèèçÿÿhðzBSèí±þÿUèg[ÿÿ‹T$ Rèm‘þÿƒÄ3À_^][ƒÄ`ËD$tL$VQj‰D$ èûúÿÿƒÄ …ÀujohxFjrjojèrgþÿƒÄ3À_^][ƒÄ`ËT$PjRèØŽþÿ‹D$ƒÄ _^][ƒÄ`ÃVW‹|$…ÿt‹7…öu(è[Žþÿ‹ð…öujQhFjhšj ègþÿƒÄ3À_^ËD$ P‰Fè þÿƒÄƒø‰t2ƒøttjphFh£ëC‹D$‹L$PQjè-¾ÿÿƒÄ ‰F …ÀuQjjë‹T$‹D$RPjèúÿÿƒÄ ‰F …Àu2j`hFj hšj èfþÿƒÄ…öt…ÿt97t Vè:þÿƒÄ_3À^Ã…ÿt‰7‹Æ_^ËD$PÿFƒÄ…ÀuÃV‹ð‹D$ W¹ ‹øó¥_^ÃSV‹\$‹t$W‹|$ƒ?tHhõIShÈFVè›ÇþÿƒÄ…À„´‹PVè'—ƒÄ…À„ jhŒÏHVè¤ÿÿƒÄ …À„ˆ‹G…Àt=hõISh¼FVèLÇþÿƒÄ…Àti‹OQVè[šƒÄ…ÀtXjhŒÏHVè7¤ÿÿƒÄ …ÀtD‹G…ÀtChõISh¬FVèÇþÿƒÄ…Àt%‹WRVè7—ƒÄ…ÀtjhŒÏHVèó£ÿÿƒÄ …Àu_^3À[Ã_^¸[ËD$V‹t$hõIPhÔFVè¦ÆþÿƒÄ…Àu^ËL$ QVèÒ–ƒÄ÷ØÀ^÷ØÃ‹D$V‹t$hõIPhÔFVèfÆþÿƒÄ…Àu^ËL$ QVèâHÿÿƒÄ÷ØÀ^÷ØÃé{ÿÿ‹T$…Òt*‹D$SVW‹‹p‹:‹ÙÁéó¥‹Ëƒá󤋋2ñ_‰2‹^[ËT$‹ÃS‹\$UV…ÛWt‹;…ÿuèÿÿ‹ø‹t$‹l$U‹PWèUºÿÿƒÄ …Àu4…ÿt…Ût9;t WèܨþÿƒÄhâhØFjAjfj'èdþÿƒÄ3À_^][ËÍ…Û‰t‰;‹Ç_^][ËD$Pè–¨þÿYËD$V‹t$hõIPhÔFVèFÅþÿƒÄ…À3À^ËL$ jQVè>™ƒÄ 3Ò…ÀŸÂ‹Â^Ãé›ÿÿSUV‹t$W‹|$ hõIWh‚FVèóÄþÿƒÄ…Àޝ‹l$h‚j‹EPVè³™ƒÄ…ÀŽ‹M3ÛQèÝ­þÿƒÄ…À~s?‰T$ ‹ESPèÕ­þÿ‹L$(hõIQhøFV‹øèŽÄþÿƒÄ…À~N‹RVèGÿÿƒÄ…À~>hôFVè,¢ÿÿƒÄ…À~,‹GPVèƒÄ…À~‹MCQèj­þÿƒÄ;Ø|”_^]¸[Ã_^]3À[ø8‚FËD$h8‚FPè!.ÿÿƒÄøp‚FøTèÖË‹D$\SUVW3ÿP‰|$èò¬þÿƒÄ…ÀŽë‹|$‹L$lWQèæ¬þÿ‹T$x‹L$p‹ðR‹FPQè!ƒÄ‰D$p…À„òWP軬þÿ‹‹èRD$ jPPèêEÿÿ‹}ƒÉÿ3Àjuò®÷ÑI|$,‹ÑƒÉÿò®÷ÑIhÀ‚FD Pè¾sþÿ‹ØƒÄ …Û„®ƒÉÿ|$3Àò®÷Ñ+ù‹Ñ‹÷‹ûÁéó¥‹Êƒáó¤¿ôFƒÉÿò®÷Ñ+ù‹÷‹Ñ‹ûƒÉÿò®‹ÊOÁéó¥‹Êƒáó¤‹}ƒÉÿò®÷Ñ+ù‹÷‹Ñ‹ûƒÉÿò®‹ÊOÁéó¥‹Êƒáó¤‹EPè¹uþÿ‹t$‹L$pFQ‰]‰t$èÓ«þÿƒÄ;ðŒãþÿÿ‹D$p…Àuè«§þÿ_^][ƒÄTÃjxhÀ‚FjAhŠj"èî`þÿƒÄ3À_^][ƒÄTøèVÊSUVWèm§þÿ…À‰D$u%hhÀ‚FjAh‹j"è­`þÿƒÄ3À_^][ƒÄËD$0ÇD$Pè>«þÿƒÄ…ÀŽô‹L$‹T$0QRè4«þÿh8‚F‹èèø$ÿÿ‹ØƒÄ …Û„ ‹D$SPèªþÿƒÄ…À„ ‹Mj;Qÿ˜FƒÄ…À„«‹U‹ð+ò@‰D$‹U‰T$ ‹CPèâžþÿ‹T$0‹D$,L$QRPènƒÄ‰C…À„Ðh¤NhÀ‚FQèÝqþÿ‹øƒÄ …ÿtb‹UVRWÿ0FjWÆ7èlÓþÿƒÄ‰…ÀtHWè-tþÿ‹t$‹D$4FP‰t$èJªþÿƒÄ;ðŒ ÿÿÿ‹D$_^][ƒÄÃh›hÀ‚FhëCh¥ë5h¬hÀ‚Fjwh‹j"èS_þÿWhÜ‚Fjè–gþÿWèÀsþÿƒÄ$ëh–hÀ‚FjAh‹j"è#_þÿƒÄ‹L$huCQèA©þÿƒÄ3À_^][ƒÄøƒFøPèfÈVW‹|$`3öW舩þÿƒÄ…À~3VW芩þÿPD$jPPè½BÿÿL$xT$QRjè¼&WFèU©þÿƒÄ$;ð|Í‹D$d_^ƒÄPÃSUVWè'¥þÿ‹è…íuj}h0ƒFjAjgj"èo^þÿƒÄ3À_^][Ë\$3ÿSè ©þÿƒÄ…À~:WSè ©þÿ‹ðƒÄ‹F…Àu‹FjPèäÑþÿƒÄ…ÀtPUèæ§þÿSGèϨþÿƒÄ ;ø|Æ_‹Å^][Ãhð¾BUè6¨þÿh‡h0ƒFjnjgj"èñ]þÿ‹F‹N‹PhŒpFQh„pFRhxpFjè fþÿƒÄ83À_^][øxƒFøÀƒFÃU‹l$ V‹EPè²ÿÿ‹L$‹T$P@PhõIQh„FRè¿þÿ‹E3öPè¨þÿƒÄ …À~cSW‹MVQè¨þÿ‹ø‹Rjè‹(‹L$,‹Ø‹D$0ShõIPhøƒFQ迾þÿSè©qþÿ‹W‹D$DRPèKŽ‹MFQèÁ§þÿƒÄ4;ð|©_[^¸]Ã^¸]øèfÆS‹\$VWSÇD$3ÿè§þÿƒÄ…À~cWSè§þÿ‹p‹@PjèS(ƒÄ…Àt%jÿVPD$PèNƒÄ…Àt+SGè@§þÿƒÄ;ø}$ë¿hh(„Fhƒj}j"èo\þÿƒÄ_^3À[YËD$ _^[YËT$SU3ÛVW…Ò„œ‹D$…À„‹|$…ÿ„„‹l$ ƒýÿu Í3Àò®÷ÑI‹éƒý@~"hÂh(„Fh„j~j"èõ[þÿƒÄ3À_^][Ë2…öu2hÀƒFèk ÿÿ‹ðƒÄ…ö„°‹jPèt¯ÿÿƒÄ…À„›‹L$‰1‹V3ÿRèX¦þÿƒÄ…À~5‹FWPèW¦þÿ‹L$ ‹ØQ‹Rèx þÿƒÄ…À„ž‹FGPè#¦þÿƒÄ;ø|ËhxƒFèòÿÿ‹ØƒÄ…Ût;ƒýÿu‹|$ Í3Àò®÷ÑI‹é‹L$‹SUQRè–žþÿƒÄ …Àt‹FSPèå¤þÿƒÄ…ÀulhØh(„FjAj~j"è [þÿhxƒFSèž&ÿÿhÀƒFVè“&ÿÿ‹L$8ƒÄ$3À_^]Ç[ËC…À„hÿÿÿhËh(„Fh…j~j"è¼ZþÿƒÄ3À_^][ËT$_^‰]¸[Ãh½h(„Fjkj~j"èZþÿƒÄ3À_^][ÃV‹t$ WVèT›‹T$ƒÄ‹J4‹y…ÿt;t‹yƒÁ …ÿuòVRè.%ƒÄ_^ËAPèß;ÿÿƒÄ_^ÃS‹\$ WS3ÿèÒ¤þÿƒÄ…ÀŽžVWSèϤþÿ‹ðƒÄ‹…Àt5ƒ8u‹L$‹PQRjèŸƒÄ ‰D$ëD$Ph¬†Fhœ†Fèâ!ƒÄ ‹F…ÀtL$Qh¬†FhT†FèÄ!ƒÄ ‹F…ÀtT$Rh¬†FhH†Fè¦!ƒÄ SGè<¤þÿƒÄ;øŒkÿÿÿ‹D$^_[ËD$_[øèæÂSUVW3í3ÿèùŸþÿ…À‰D$„É‹D$ 3ÛPèñ£þÿƒÄ…ÀŽš‹L$ SQèë£þÿ‹T$$P‹D$$RPè‹‹øƒÄ…ÿ„¥è ˜þÿ‹è…ítWUè¼¢þÿƒÄ…ÀtqhØ…F3ÿèyÿÿ‹ðƒÄ…öt\‹L$VQè•¢þÿƒÄ…ÀtTþÿƒÄ3À_^][ƒÄø‡Fø`‡FËD$h`‡FPè¡ÿÿƒÄøȇFøˆFøXˆFø ˆFøè&½SUVWè=šþÿ‰D$‹D$4Pè/%‹Ø3ÀS‰\$,‰D$(‰D$ è)žþÿƒÄ…ÀŽ~‹L$QSè#žþÿ‹øƒÄ‹G…À…œ‹o…í„‘¾°‰F‹ÅŠŠÊ:u„ÉtŠPŠÊ:VuƒÀƒÆ„Éuà3ÀëÀƒØÿ…Àu ÇD$ éý€}@…¿‹\$0EUSè1‹ðƒÄ…ö‰t$„ h`‡FèfÿÿƒÄ‰D$4…À„7VÇD$èiþÿƒÄ…ÀŽ˜‹D$‹L$PQè_þÿ‹ðƒÄ¿œ‰F‹n‹ÅŠŠÊ:u„ÉtŠPŠÊ:WuƒÀƒÇ„Éuà3ÀëÀƒØÿ…Àu P‹FPè ÆþÿƒÄ…À„Ž‹L$4‰éh˜‰FUè-ƒÄ…Àu‹|$4‹G…ÀuèÁ˜þÿ‰GhˆFè¤ÿÿ‹øƒÄ…ÿ„w‹T$4W‹BPè¹›þÿƒÄ…À„^h¤èÄÂþÿj‰èK–þÿ‹ÐƒÉÿ‰W‹v‹þ3Àò®÷ÑIQVRè•þÿƒÄ…À„$ë~‹NhŒ‰FQèt,ƒÄ…À…‹F€8@…Û@PSèÅ‹øƒÄ…ÿ„׋T$ RWSèWS‹ðèÃąötm‹|$4‹G…Àuèì—þÿ‰G‹GVPèÿšþÿƒÄ…À„¤‹t$‹L$FQ‰t$èÑ›þÿƒÄ;ðŒhþÿÿ‹t$4ƒ>u2hñhp‰Fh‹hƒj"èòPþÿƒÄ‹T$4h`‡FRè€ÿÿƒÄ3ö‹D$PSè0ƒÄ…ö„Mé¤hÄhp‰Fjnë?h×hp‰Fh‰ë.hÝhp‰Fh‡ëhøhp‰FjAë„hêhp‰FhŠhƒj"ègPþÿ‹V‹F‹RhŒpFPh„pFQhxpFjè–XþÿƒÄ0éOÿÿÿjUèæÃþÿ‹ØƒÄ…Ûthh`‡Fè³ÿÿ‹ðƒÄ‰‹L$VQèÑ™þÿ‹\$,ƒÄ‹t$SF‰t$諚þÿƒÄ;ðŒ‚üÿÿh¡CSèšþÿ‹D$$ƒÄ_^][ƒÄÃhhp‰Fh‡ëh§hp‰Fjnëh‘hp‰Fh†h‚j"èœOþÿ‹W‹G‹RhŒpFPh„pFQhxpFjèËWþÿƒÄ0‹T$h„CRè™™þÿƒÄ3À_^][ƒÄø èÆ¸SUVWhˆFèÈÿÿ‹øƒÄ…ÿ‰|$„±h¥èý¿þÿhXˆF‰è¡ÿÿ‹ðƒÄ…ö‰t$„Š‹D$$3ÛP‰w‰\$è™þÿƒÄ…ÀŽÍ‹L$$SQè—™þÿ‹èƒÄ¾È‰F‹}‹ÇŠŠÊ:u„ÉtŠPŠÊ:VuƒÀƒÆ„Éuà3ÀëÀƒØÿ…Àu7jè“þÿ‹Ð‹D$ƒÉÿ‰P‹u‹þ3Àò®÷ÑIQVRèÔ‘þÿƒÄ…À„ó鈾ԈF‹ÇŠŠÊ:u„ÉtŠPŠÊ:VuƒÀƒÆ„Éuà3ÀëÀƒØÿ…Àuh‹t$‹…Òuh ˆFè¬ÿÿ‹ÐƒÄ…Ò„™‰‹D$(…Àt ‹Ç@ë ‹ ÇA‹uƒÉÿ‹þ3Àò®‹÷ÑIQVRè8‘þÿƒÄ …À„Wé쾸‰F‹ÇŠŠŠÊ:Óu„ÉtŠPŠ^ŠÊ:ÓuƒÀƒÆ„ÉuÜ3ÀëÀƒØÿ…À…5‹|$‹7…öuh ˆFèÿÿ‹ðƒÄ…ö„õ‰7‹EPè‹øƒÄ…ÿ„ëWèý—þÿƒÄ…À„Ú‹^W3öèç—þÿƒÄ…À~5VWèé—þÿ‹HQj较ąÀt^PSèЖþÿƒÄ…ÀtfWFè²—þÿƒÄ;ð|˾h¡CWè—þÿƒÄ…ö„û‹\$‹T$$CR‰\$è}—þÿƒÄ;ØŒàýÿÿ‹t$é¤hNhp‰FhŒh…ëhVhp‰FjAh„j"è‹LþÿƒÄhàBSè­–þÿƒÄ3öë€h=hp‰FjAëth%hp‰Fhëh.hp‰FhŠh„j"è‰ÿÿ‹D$$ƒÄ‹@…Àt‹PRhõIUhä‰FVè[«þÿƒÄ‹\$0‹l$‹|$,UG‰|$0èa”þÿƒÄ;øŒŠþÿÿ‹|$‹T$(GR‰|$èC”þÿƒÄ;øŒþÿÿ_^]¸[ƒÄËG‹HCQhõIPh؉FVèðªþÿƒÄ뛸ƒÄÃS‹\$ VWS3öèñ“þÿƒÄ…À~+‹|$U‹l$VSèê“þÿWPUè2S‹øFèÉ“þÿƒÄ;ð|á]ë‹|$…ÿu è¢þÿ_^[ËÇ_^[øèf²‹„$‹ƒù‡éÿ$D‘C„$ PhÄŠFh¸ŠFèÆ‹„$ƒÄ ÄÃŒ$ QhÄŠFh¬ŠFèž‹„$ƒÄ ÄÔ$ RhÄŠFhœŠFèv‹„$ƒÄ ÄËPŒ$ Q‹BPh”ŠFèL‹„$ƒÄ ÄËPŒ$ Q‹BPhŠFè"‹„$ƒÄ ÄËPŒ$ Q‹BPhŒŠFèø‹„$ƒÄ ÄËPL$hQRèD^þÿ„$L$ PQh„ŠF轋„$$ƒÄÄË@‹‹Hƒút(”$ RhxŠFhlŠF舋„$ƒÄ ÄÃ3À3ÒŠAŠQPR3À3ÒŠAŠPRD$h¤!IPÿFŒ$$T$QRhlŠFè9‹„$0ƒÄ$ÄË@L$PhQè+ÿÿ”$D$ RPh\ŠFèþƒÄ‹„$ ÄÃSCËCõC{CIC£CC„C‘CV‹t$ W‹ƒø‡Wÿ$…à’C‹D$ h`‹FPè¨þÿƒÄ¸_^ËL$ hH‹FQèÿ§þÿƒÄ¸_^ËT$ h,‹FRèå§þÿƒÄ¸_^ËF‹T$ ‹HQh ‹FRèħþÿƒÄ ¸_^ËF‹T$ ‹HQh‹FR裧þÿƒÄ ¸_^ËF‹T$ ‹HQh‹FRè‚§þÿƒÄ ¸_^Ë|$ h‹FWèh§þÿ‹Fh‚jPWè7|ƒÄ¸_^Ëv‹‹Fƒùt‹L$ hìŠFQè0§þÿƒÄ¸_^Ã3Ò3ÉŠPŠHRQ3Ò3ÉŠPŠR‹T$QhÔŠFRèÿ¦þÿƒÄ¸_^Ë|$ h\ŠFWèå¦þÿ‹FPWèk)ÿÿƒÄ_¸^È‘CÖ‘C÷‘C¢‘C9’C¼‘C’Cd’C¼’C¸膮SUVWè‹þÿ‹Ø…Ûu hÔh€‹FjAjvj"èâDþÿƒÄ3À_^][YË|$ 3öW‰t$èwþÿƒÄ…ÀŽ„‹l$VWèqþÿ‹øhÔ F‹GPèqƒÄ…À…Ø‹G…À„;x‹FŠŠÊ:u„ÉtŠPŠÊ:VuƒÀƒÆ„Éuà3ÀëÀƒØÿ…À…—…í„çƒ}„¢‹E…À„ÒjÿjUPè~þÿƒÄ …ÀŒ‚P‹EPè‰þÿƒÄ…À„šPèèSÿÿ‹ðƒÄ…ö„‡V3ÿ裎þÿƒÄ…À~#WV襎þÿPSèžþÿƒÄ…ÀtUVG耎þÿƒÄ;ø|ÝVèCŽþÿƒÄë‹L$WUQè"ƒÄ …Àt]PSèdþÿƒÄ‹t$‹|$ FW‰t$è>ŽþÿƒÄ;ð}OéÊþÿÿhh€‹FjAëhúh€‹Fj~ë hóh€‹Fjj{j"èQCþÿƒÄhðBSèsþÿƒÄ3À_^][YÃ_^‹Ã][Yø覬SUVW轉þÿ‹Ø…Ûu hh€‹FjAjvj"èCþÿƒÄ3À_^][YË|$ 3öW‰t$è—þÿƒÄ…ÀŽý‹l$VWè‘þÿ‹øh”ŠF‹GP葃ąÀuN‹G…ÀtG¾x‹FŠŠÊ:u„ÉtŠPŠÊ:VuƒÀƒÆ„Éuà3ÀëÀƒØÿ…ÀuPSUè¹ƒÄ …À„—ëo‹Gh”ŠFPè.ƒÄ…Àu=‹G…Àt6¾œ‹FŠŠÊ:u„ÉtŠPŠÊ:VuƒÀƒÆ„Éuà3ÀëÀƒØÿ…Àujëš‹D$WUPè~ƒÄ …Àt0PSèÀ‹þÿƒÄ‹t$‹|$ FW‰t$蚌þÿƒÄ;ðŒÿÿÿ_^‹Ã][YÃhðBSèü‹þÿƒÄ3À_^][YËD$SUV‹W3Û3ÿƒùu _^]¸[Ã…À„Ï‹H…Éu‹P …Ò„½…Ét QèLþÿƒÄ‹èë‹@ ‹‹ijÿj0Uè†~þÿ‹ðƒÄ …ö|°VUèæ~þÿPè[Pèúƒþÿ‹Ø‹D$,ƒÄ…Àt VUèþÿƒÄN…ÛtTèéþÿ‹ø…ÿtI‹T$W‰_R3ÛÇèÍŠþÿƒÄ…ÀtVj0U3ÿè~þÿ‹ðƒÄ …ö}•_^]¸[ÃhTh€‹FjAëhMh€‹FjAë h:h€‹Fj}jzj"è·@þÿƒÄWè~þÿSèh…þÿƒÄ3À_^][øèª‹D$ SUV‹h‹p…íu!h‡h€‹Fj|juj"è`@þÿƒÄ3À^][ƒÄÃèþÿ‹Ø…Û‰\$ u!hŒh€‹FjAjuj"è0@þÿƒÄ3À^][ƒÄÃh”ŠFVèéƒÄ…Àuc¾jèv„þÿ‹ÐƒÄ…Ò‰St!W‹ýƒÉÿ3Àò®÷ÑIQURèEƒþÿƒÄ …À_…§h½h€‹FjAjuj"èÄ?þÿƒÄSè‹~þÿƒÄ3À^][ƒÄÃhŒŠFVètƒÄ…Àu¾ë‰hŠFVè[ƒÄ…Àu ¾émÿÿÿh¤‹FVè?ƒÄ…ÀuAPUè³þÿƒÄ…Àu hœh€‹Fjwjuj"èE?þÿUhÜ‚Fég‰C¾‰3^‹Ã][ƒÄÃh”&IVèìƒÄ…À…#D$L$PT$QD$RPh¤!IUÿ¬FƒÄƒø…Ú‹\$…ÛŒÊûÿ¾‹T$…ÒŒ²úÿ¦‹L$…ÉŒšùÿŽ‹D$…ÀŒ‚=ÿ{jˆ\$0ˆT$1ˆL$2ˆD$3èã‚þÿ‹L$ƒÄ…À‰At(T$,jRPè¸þÿƒÄ …Àt‹\$ ¾‹Ã‰3^][ƒÄÃh¯h€‹FjAjuj"è(>þÿ‹\$ ƒÄSèë|þÿƒÄ3À^][ƒÄË\$ h¨h€‹Fjvjuj"èö=þÿUhÜ‚Fëh´h€‹Fjujuj"èÙ=þÿVhÜ FjèFþÿƒÄ Sè“|þÿƒÄ3À^][ƒÄøЋFËD$V‹t$WhõIPhÔFVèŸþÿ‹|$ ƒÄƒ?t0j h ŒFVè |ÿÿ‹QVè3o‹GƒÄ…Àt1jh´ IVèì{ÿÿƒÄ ‹G…Àtj hŒFVèÕ{ÿÿ‹WRVèûnƒÄ_¸^ËD$V‹p4‹F…Àt9W‹|$‹QWèã›ÿÿƒÄ…Àt‹FT$RjPèüƒÄ ‹FƒÆ …ÀuÓ‹D$_^ËD$^ø èF¦SUVWjè+þÿ‹ØƒÄ…Û‰\$ujwhÀFjAjej"èœ<þÿƒÄ3À_^][ƒÄ Ë|$(3öW‰t$è/‡þÿƒÄ…ÀŽÔVWè-‡þÿ‹ð‹D$(ƒÄ‰t$‹h4‹}…ÿ„‰‹^‹M‹óŠŠÐ:u„ÒtŠAŠÐ:FuƒÁƒÆ„Òuà3ÉëɃÙÿ…Ét=‹ó‹ÇŠŠÊ:u„ÉtŠPŠÊ:VuƒÀƒÆ„Éuà3ÀëÀƒØÿ…Àt ‹}ƒÅ …ÿu“ë‹E‹L$jPQè ™ÿÿƒÄ ‹t$‹E…Àt,‹t$‹|$(FW‰t$è_†þÿƒÄ;ðŒ0ÿÿÿ‹\$_^‹Ã][ƒÄ Ãh…hÀFjojej"è;þÿ‹V‹F‹RhŒpFPh„pFQhxpFjè°Cþÿ‹T$@Rè€þÿƒÄ43À_^][ƒÄ ËD$‹‹PQRèPƒÄø(è–¤SVW‹|$@¾øF‹ÇŠŠŠÊ:Óu„ÉtŠPŠ^ŠÊ:ÓuƒÀƒÆ„ÉuÜ3ÀëÀƒØÿ…Àjtbè@þÿ‹ðƒÄ…öujVhÜFjAjpj"èµ:þÿƒÄ3À_^[ƒÄ(ÃD$@PWèNƒÄ‰F…ÀuVèNþÿƒÄ3À_^[ƒÄ(ËL$@‹Æ‰_^[ƒÄ(ÃèÞ~þÿ‹øƒÄ…ÿujphÜFjAjsj"èS:þÿƒÄ3À_^[ƒÄ(ËL$<…É„‚ƒ9u ‹Ç_^[ƒÄ(ËA …Àu ‹Q…Òtf…Àt‹‹Bë‹I‹‹B‹p…öuh€ëGjèW!ÿÿL$P‹T$Q‹NRPQè@½þÿ‹T$$D$(RPWè0}þÿƒÄ$…Àu“h‡hÜFjAjsë jwhÜFjrjrj"è§9þÿƒÄWè^~þÿƒÄ3À_^[ƒÄ(ÃS‹\$ …Ût<‹…Àt6jU@hŽFPèsKþÿƒÄ …Àt!‹ V‹s‹ÑW‹øÁéó¥‹Êƒáó¤‹ _^[ÆÃ3À[ÃS‹\$…ÛVuj`hŽFjkjdj"è$9þÿƒÄ3À^[Ãjè…}þÿ‹ðƒÄ…öt&W‹ûƒÉÿ3Àò®÷ÑIQSVèW|þÿƒÄ …À_u#Vè©}þÿƒÄjnhŽFjAjdj"èÔ8þÿƒÄ3À^[ËÆ^[ËL$‹A‹@…Àt‹T$‹IRQÿЃÄÃ3ÀËT$…Òt‹L$‹A‹@ …Àt ‹IRQÿЃÄËD$ ‹L$‹T$PQRèL|ƒÄ ËD$‹L$PQèÑ{ƒÄËD$ ‹L$‹T$PQRèlzƒÄ ËD$‹L$PQè±yƒÄËD$SUVW3ö3ÿ3í…ÀtPèxÿÿ‹øƒÄ…ÿt^‹D$…ÀtPèaÿÿ‹èƒÄ…ítGjRhŽFj èªIþÿ‹ðƒÄ …öt0‹\$ƒ;u è3~þÿ…À‰tlj~‰n‹VPè8þÿƒÄ…ÀuCjZhŽFjAjij"è_7þÿƒÄ…öt VèÒKþÿƒÄ…ÿt WèÅKþÿƒÄ…ít Uè¸KþÿƒÄ_^]3À[Ã_^]¸[ÃV‹t$…öt8‹F…Àt PèŠKþÿƒÄ‹F…Àt PèzKþÿƒÄ‹…Àt PèkKþÿƒÄVèbKþÿƒÄ^ËD$SUV…ÀW„Ê‹D$3ö3ÿ3Û…ÀtPèLÿÿ‹øƒÄ…ÿtf¸ìI…ÀtPè4ÿÿ‹ØƒÄ…ÛtNjRhŽFj è}Hþÿ‹ðƒÄ …öt7‹l$ƒ}u è}þÿ…À‰Et!lj~‰^‹MVQè€þÿƒÄ…À… jZhŽFjAjij"è+6þÿƒÄ…öt VèžJþÿƒÄ…ÿt Wè‘JþÿƒÄ…Û„ËSè€JþÿƒÄ3À_^][ËD$3ö3ÿ3Û…ÀtPè‚ÿÿ‹øƒÄ…ÿtbºäI…ÒtRèjÿÿ‹ØƒÄ…ÛtJjRhŽFj è³Gþÿ‹ðƒÄ …öt3‹l$ƒ}u è;|þÿ…À‰Etlj~‰^‹EVPè>þÿƒÄ…ÀuCjZhŽFjAjij"èe5þÿƒÄ…öt VèØIþÿƒÄ…ÿt WèËIþÿƒÄ…Ût Sè¾IþÿƒÄ_^]3À[Ã_^]¸[ËD$W3ÿ…Àu_ÃVjPèZv‹ðƒÄ…ötVèky‹øƒÄ…ÿuhˆhŽFjAjyj"èÝ4þÿƒÄVèTÌþÿƒÄ‹Ç^_ËD$W3ÿ…Àu_ÃVjPèjŠÿÿ‹ðƒÄ…ötVè y‹øƒÄ…ÿuh”hŽFjAjxj"è}4þÿƒÄVèôËþÿƒÄ‹Ç^_øèÖVWÇD$è'Ìþÿ‰D$‹D$…Àuh¡hŽFjmjlj"è&4þÿƒÄ3À_^YÀ8-u@¿ë3ÿ€80uŠH€ùxt€ùXuƒÀPD$ Pèîyë L$PQè{ƒÄ…Àuh²hŽFjdjlj"èÅ3þÿƒÄ3À_^YËL$…ÿt‹A…Àt ƒøu ‹ƒ:u3ÿjQèwˆÿÿ‹ð‹D$Pè ËþÿƒÄ …öuh»hŽFjejlj"èo3þÿƒÄ3À_^YÃ…ÿt ‹F€Ì‰F‹Æ_^YËD$SU3í;ÅVu ^]¸[ÃUP‰l$èïˆÿÿ‹ðƒÄ;õtVèwƒÄ;ʼnD$uh”hŽFjAjxj"è3þÿƒÄVèwÊþÿ‹\$ƒÄ;Ýu^]3À[ËD$W3ö3ÿ…ÀtPèsÿÿ‹øƒÄ…ÿtVSèdÿÿ‹èƒÄ…ítGjRhŽFj è­Dþÿ‹ðƒÄ …öt0‹\$ƒ;u è6yþÿ…À‰tlj~‰n‹VPè;|þÿƒÄ…ÀuRjZhŽFjAjij"èb2þÿƒÄ…öt VèÕFþÿƒÄ…ÿt WèÈFþÿƒÄ…ít Uè»FþÿƒÄ‹L$3öQè¬FþÿƒÄ‹Æ_^][ËL$¾Qè“FþÿƒÄ‹Æ_^][ÃSU‹l$ VW‹}…ÿ„ȾìI‹ÇŠŠŠÊ:Óu„ÉtŠPŠ^ŠÊ:ÓuƒÀƒÆ„ÉuÜ3ÀëÀƒØÿ…À„á¾LŽF‹ÇŠŠŠÊ:Óu„ÉtŠPŠ^ŠÊ:ÓuƒÀƒÆ„ÉuÜ3ÀëÀƒØÿ…À„¥¾ ÒH‹ÇŠŠŠÊ:Óu„ÉtŠPŠ^ŠÊ:ÓuƒÀƒÆ„ÉuÜ3ÀëÀƒØÿ…À„i¾üÑH‹ÇŠŠŠÊ:Óu„ÉtŠPŠ^ŠÊ:ÓuƒÀƒÆ„ÉuÜ3ÀëÀƒØÿ…À„-¾HŽF‹ÇŠŠŠÊ:Óu„ÉtŠPŠ^ŠÊ:ÓuƒÀƒÆ„ÉuÜ3ÀëÀƒØÿ…À„ñ¾DŽF‹ÇŠŠŠÊ:Óu„ÉtŠPŠ^ŠÊ:ÓuƒÀƒÆ„ÉuÜ3ÀëÀƒØÿ…À„µ¾äI‹ÇŠŠŠÊ:Óu„ÉtŠPŠ^ŠÊ:ÓuƒÀƒÆ„ÉuÜ3ÀëÀƒØÿ…À„e¾<ŽF‹ÇŠŠŠÊ:Óu„ÉtŠPŠ^ŠÊ:ÓuƒÀƒÆ„ÉuÜ3ÀëÀƒØÿ…À„)¾4ÓH‹ÇŠŠŠÊ:Óu„ÉtŠPŠ^ŠÊ:ÓuƒÀƒÆ„ÉuÜ3ÀëÀƒØÿ…À„í¾TÓH‹ÇŠŠŠÊ:Óu„ÉtŠPŠ^ŠÊ:ÓuƒÀƒÆ„ÉuÜ3ÀëÀƒØÿ…À„±¾8ŽF‹ÇŠŠŠÊ:Óu„ÉtŠPŠ^ŠÊ:ÓuƒÀƒÆ„ÉuÜ3ÀëÀƒØÿ…Àty¾HÓH‹ÇŠŠŠÊ:Óu„ÉtŠPŠ^ŠÊ:ÓuƒÀƒÆ„ÉuÜ3ÀëÀƒØÿ…ÀtAhÞhŽFjhjnj"è/þÿ‹E‹M‹UPhŒpFQh„pFRhxpFjè>7þÿƒÄ03À_^][ËD$_^]Ǹ[ËL$_^]Çÿ¸[ÃV‹t$‹FPjè@úÿÿƒÄ…Àu(‹N‹V‹QhŒpFRh„pFPhxpFjèÈ6þÿƒÄ3À^ËL$ ^‰¸øèÖ—‹D$SUVW3ÛP‰\$èâÿÿ‰D$ ‰D$(‹èŠƒÄÇD$„À‰\$„‹=´F< „&< „‹L$I„¢I…Ó<,…Ë‹L$$ÇD$ÆŠE„À„Å‹÷‹¸Fƒ:~3ÀjŠEPÿÖƒÄë‹°F3ÉŠM‹ŠHƒà…ÀtŠEE„ÀuÇ€}„€‹ýƒÉÿ3Àò®÷ÑIt)ÿ;õtD‹=´F‹ ¸Fƒ9~3ÒjŠRÿ׃Äë‹ °F3ÀŠ‹ŠBƒà…ÀtN;õuÌë;îtÆF€}„…í„‹D$3ö3ÿ3Û…ÀtPè²ÿÿ‹øƒÄ…ÿtYUè£ÿÿ‹ØƒÄ…ÛtJjRhŽFj èì>þÿ‹ðƒÄ …öt3‹D$…Àu èvsþÿ…À‰D$tlj~‰^‹L$VQèwvþÿƒÄ…Àu„ý‹þƒÉÿ3Àò®÷ÑI|1ÿ;þtB‹´F¡¸Fƒ8~3ÉjŠQÿÓƒÄë¡°F3ÒŠ‹ŠQƒà…ÀtO;þuÎë;÷tÆG€>„ž‹Þ…ö‰\$„‹T$$jé_<,…W‹D$$ÆŠE„ÀtE‹5´F‹ ¸Fƒ9~3ÒjŠURÿÖƒÄë‹ °F3ÀŠE‹ŠBƒà…ÀtŠEE„ÀuÇ€}u3Ûë_‹ýƒÉÿ3Àò®÷ÑIt)ÿ;õtB‹=´F¡¸Fƒ8~3ÉjŠQÿ׃Äë¡°F3ÒŠ‹ŠQƒà…ÀtN;õuÎë;îtÆFŠ]öÛÛ#Ý‹T$$‰\$…Ûj„½S3ÿèJ ÿÿ‹ðƒÄ…ötNjRhŽFj è“<þÿ‹øƒÄ …ÿt7‹D$…Àu èqþÿ…À‰D$t"ljwÇG‹D$WPètþÿƒÄ…Àu/jZhŽFjAjij"èA*þÿƒÄ…ÿt Wè´>þÿƒÄ…öt Vè§>þÿƒÄ‹D$$@‰D$$Š„Àt*éñûÿÿh$hŽFjméùhéèhéÞƒ|$…ÁŠE‹õ„Àt=‹=´F‹ ¸Fƒ9~3ÒjŠRÿ׃Äë‹ °F3ÀŠ‹ŠBƒà…ÀtŠFF„ÀuÉ€>t_‹þƒÉÿ3Àò®÷ÑI|1ÿ;þtB‹-´F¡¸Fƒ8~3ÉjŠQÿÕƒÄë¡°F3ÒŠ‹ŠQƒà…ÀtO;þuÎë;÷tÆG€>t…öuh5hŽFjmë"T$RVSëSUèyƒÄ…Àu>h?hŽFjljmj"èý(þÿ‹D$0ƒÄPèp=þÿ‹L$h¡CQèsþÿƒÄ 3À_^][ƒÄÃT$RjPè×ðÿÿ‹D$(ƒÄ Pè:=þÿ‹D$ƒÄ_^][ƒÄÃS‹\$U‹-´F€;t5¡¸Fƒ8~3ÉjŠ QÿÕƒÄë¡°F3ÒŠ‹ŠQƒà…ÀtŠCC„ÀuË€;u]3À[ÃVW‹ûƒÉÿ3Àò®÷ÑItÿ;ótI‹¸Fƒ:~3ÀjŠPÿÕƒÄë‹°F3ÉŠ‹ŠHƒà…ÀtN;óuÌŠ_öØÀ^#Ã][Ã;ÞtÆFŠ_öØÀ^#Ã][ÃS‹\$VW…Ût=‹t$…öt5hkDvhŽFPè¹9þÿ‹øƒÄ …ÿuhlhŽFjAjoj"è›'þÿƒÄ_^3À[Ã…ö‹Ï‹Ó~)3ÀŠÁèAŠ€¸¯IˆAÿŠƒàAABŠ€¸¯INˆAþÆAÿ:u׋Ç_^ÆAÿ[ø èÆSUV‹t$…öWu"h†hŽFjkjqj"è%'þÿƒÄ3À_^][ƒÄ ËþƒÉÿ3Àh‰ò®÷ÑIhŽFÑùQèú8þÿ‹ÐƒÄ …Ò‰T$u"h­hŽFjAjqj"èØ&þÿƒÄ3À_^][ƒÄ ʋʄÀ‹î‰L$„‹=´FŠ]E€û:ˆ\$„ôŠME„ɈL$ „¡¸F‹t$ƒ8~æÿjVÿ׊L$(ƒÄë‹°Fæÿ‹Špƒà…ÀtVÿFŠL$$ƒÄŠØ‹¸F‹t$ ƒ:~æÿjVÿ׊L$(ƒÄë¡°Fæÿ‹Šrƒà…ÀtVÿFƒÄˆD$ ŠÈ€û0r €û9w€ÃÐë€ûa‚„€ûfw€Ã©€ù0r €ù9w€ÁÐë €ùarh€ùfwc€Á©Àã‹T$ Ù‹L$ˆA‰L$€}…ñþÿÿ‹D$$…Àt+ʉ_^]‹Â[ƒÄ Ãh•hŽFjpjqj"èy%þÿ‹D$$Pèï9þÿƒÄ3À_^][ƒÄ ËL$QèØ9þÿh²hŽFjqjqj"èC%þÿƒÄ3À_^][ƒÄ ËT$VW‹úƒÉÿ3Àò®‹|$ ÷ÑI‹ñVRWÿüFƒÄ …ÀuŠ>„Àt <.t_¸^Ã3À_^øXŽFøxŽFÃ諼þÿ‹L$3Ò…À•‰‹ÂÃV‹t$‹…Àt)‹L$ PöAtèµ»þÿƒÄÇ^Ãè¼þÿƒÄÇ^ËD$V‹0…öuƒÈÿ^ÃWVè »þÿ$ƒÄöØÀ@‹ø‹D$…Àt…ÿtÆ@PVè†ÁþÿƒÄVèݺþÿƒÀƒÄ™ƒâÂÁøÇ_^ÃV‹t$ƒ>uèá»þÿ‰‹‹L$ P‹D$PQèÍ¿þÿƒÄ …Àu5‹…Àt+‹T$PöBtèðºþÿƒÄÇ3À^Ãè>»þÿƒÄÇ3À^ø^ø ŽFøÀŽFËD$‹T$‹H¸‰ ËD$‹T$‹H‰ ËD$‹L$U‹(‹A;èuƒÈÿ]ÃSV…íW}ƒËÿ+Ýë‹ÝS胹þÿ‹t$‹Ð€âƒÄöÚÒxBÁÿ…ö‹Êt-…Ét…íÀH%ÿˆFGÿ…À|…íˆ0}ŠÓöÒˆ0ÁëHyì9_^[]ÃU‹l$ƒývhŒë[V‹t$…íWt ö€t¿ë3ÿ3À3É…í~ Áà…ÿt Š1öÒâÿë3ÒŠ1 ÂA;Í|à…ÿ_‹È^tƒÉÿ+È‹D$;Hu"hžhìŽFh€h¦j èN"þÿƒÄ3À]ËT$¸]‰ ËL$ VÁá‹t$ UñS‹l$W‹U ìl‹}‹]‰L$D‹‹NÈɉ$‰L$‹F‹N ÈɉD$‰L$ ‹F‹NÈɉD$‰L$‹F‹NÈɉD$‰L$‹F ‹N$ÈɉD$ ‰L$$‹F(‹N,ÈɉD$(‰L$,‹F0‹N4ÈɉD$0‰L$4‹F8‹N<ÈɉD$8‰L$<‰´$„‹E‹M‰Þ‰Å1ÖÁÅ!ÎýÑÉ‹<$ÑÉ1Ö¬=™y‚Z‰Ïî1߉õ!ÇÁÅÕ‹T$ÑÈ1ßÑȬ™y‚Zï‰Â‰ý1ÊÁÅ!òÝÑ΋\$ÑÎ1ʬ™y‚Z‰óê1ÉÕ!ûÁÅÍ‹L$ ÑÏ1ÃÑϬ ™y‚Zë‰ù‰Ý1ñÁÅ!ÑÅÑÊ‹D$ÑÊ1ñ¬™y‚Z‰Ðé1ø‰Í!ØÁÅõ‹t$ÑË1øÑˬ5™y‚Zè‰Þ‰Å1ÖÁÅ!ÎýÑÉ‹|$ÑÉ1Ö¬=™y‚Z‰Ïî1߉õ!ÇÁÅÕ‹T$ÑÈ1ßÑȬ™y‚Zï‰Â‰ý1ÊÁÅ!òÝÑ΋\$ ÑÎ1ʬ™y‚Z‰óê1ÉÕ!ûÁÅÍ‹L$$ÑÏ1ÃÑϬ ™y‚Zë‰ù‰Ý1ñÁÅ!ÑÅÑÊ‹D$(ÑÊ1ñ¬™y‚Z‰Ðé1ø‰Í!ØÁÅõ‹t$,ÑË1øÑˬ5™y‚Zè‰Þ‰Å1ÖÁÅ!ÎýÑÉ‹|$0ÑÉ1Ö¬=™y‚Z‰Ïî1߉õ!ÇÁÅÕ‹T$4ÑÈ1ßÑȬ™y‚Zï‰Â‰ý1ÊÁÅ!òÝÑ΋\$8ÑÎ1ʬ™y‚Z‰óê1ÉÕ!ûÁÅÍ‹L$<ÑÏ1ÃÑϬ ™y‚Zë‹,$‹L$1é‹l$ 1é‹l$41é‰ýÑÁ1õ‰ $!ÕŒ™y‚Z1õ‰ØéÁÀÑÊÁ‹D$‹l$ 1è‹l$$1è‹l$8ÑÊ1èÑÀ‰Õ1ý‰D$!Ý„0™y‚Z1ý‰ÎÁÆÑËðÑËè‹l$‹t$1î‹l$(1î‹l$<1î‰ÝÑÆ1Õ‰t$!Í´>™y‚Z1Õ‰ÇîÁÇÑÉþ‹|$ ‹l$1ï‹l$,1ï‹,$ÑÉ1ïÑljÍ1݉|$ !ż™y‚Z1݉òÁÂÑÈ×ÑÈï‹T$‹l$1ê‹l$01ê‹l$1ê‰õÑÂ1ʼnT$1Í”¡ëÙn‰ûÁÃÑÎëÑÎÚ‹\$‹l$1ë‹l$41ë‹l$1ë‰ýÑÃ1õ‰\$1Åœ ¡ëÙn‰ÑÁÁÑÏéÑÏË‹L$‹l$ 1é‹l$81é‹l$ 1é‰ÕÑÁ1ý‰L$1õŒ¡ëÙn‰ØÁÀÑÊèÑÊÁ‹D$‹l$$1è‹l$<1è‹l$1è‰ÝÑÀ1Õ‰D$1ý„0¡ëÙn‰ÎÁÆÑËîÑËð‹t$ ‹l$(1î‹,$1î‹l$1î‰ÍÑÆ1݉t$ 1Õ´>¡ëÙn‰ÇÁÇÑÉïÑÉþ‹|$$‹l$,1ï‹l$1ï‹l$1ï‰ÅÑÇ1͉|$$1ݼ¡ëÙn‰òÁÂÑÈêÑÈ׋T$(‹l$01ê‹l$1ê‹l$1ê‰õÑÂ1ʼnT$(1Í”¡ëÙn‰ûÁÃÑÎëÑÎÚ‹\$,‹l$41ë‹l$ 1ë‹l$ 1ë‰ýÑÃ1õ‰\$,1Åœ ¡ëÙn‰ÑÁÁÑÏéÑÏË‹L$0‹l$81é‹l$1é‹l$$1é‰ÕÑÁ1ý‰L$01õŒ¡ëÙn‰ØÁÀÑÊèÑÊÁ‹D$4‹l$<1è‹l$1è‹l$(1è‰ÝÑÀ1Õ‰D$41ý„0¡ëÙn‰ÎÁÆÑËîÑËð‹t$8‹,$1î‹l$1î‹l$,1î‰ÍÑÆ1݉t$81Õ´>¡ëÙn‰ÇÁÇÑÉïÑÉþ‹|$<‹l$1ï‹l$1ï‹l$01ï‰ÅÑÇ1͉|$<1ݼ¡ëÙn‰òÁÂÑÈêÑÈ׋$‹l$1ê‹l$ 1ê‹l$41ê‰õÑÂ1ʼn$1Í”¡ëÙn‰ûÁÃÑÎëÑÎÚ‹\$‹l$ 1ë‹l$$1ë‹l$81ë‰ýÑÃ1õ‰\$1Åœ ¡ëÙn‰ÑÁÁÑÏéÑÏË‹L$‹l$1é‹l$(1é‹l$<1é‰ÕÑÁ1ý‰L$1õŒ¡ëÙn‰ØÁÀÑÊèÑÊÁ‹D$ ‹l$1è‹l$,1è‹,$1è‰ÝÑÀ1Õ‰D$ 1ý„0¡ëÙn‰ÎÁÆÑËîÑËð‹t$‹l$1î‹l$01î‹l$1î‰ÍÑÆ1݉t$1Õ´>¡ëÙn‰ÇÁÇÑÉïÑÉþ‹|$‹l$1ï‹l$41ï‹l$1ï‰ÅÑÇ1͉|$1ݼ¡ëÙn‰òÁÂÑÈêÑÈ׋T$‹l$ 1ê‹l$81ê‹l$ 1ê‰õÑÂ1ʼnT$1Í”¡ëÙn‰ûÁÃÑÎëÑÎÚ‹\$‹l$$1ë‹l$<1ë‹l$1ë‰ýÑÃ1õ‰\$1Åœ ¡ëÙn‰ÑÁÁÑÏéÑÏË‹L$ ‹l$(1é‹,$1é‹l$1é‰ÕÑÁ ý‰L$ !õŒܼ‰ÐÑÊ!ø ʼnØÁÀÅ‹D$$é‹l$,1è‹l$1è‹l$ÑÊ1èÑÀ‰Ý‰D$$ Õ„0ܼ‰Þ!ý!Ö õ‰ÎÁÆÑËõÑËè‹t$(‹l$01î‹l$1î‹l$1î‰ÍÑÆ ݉t$(!Õ´>ܼ‰ÏÑÉ!ß ý‰ÇÁÇý‹|$,î‹l$41ï‹l$ 1ï‹l$ ÑÉ1ïÑljʼn|$, ͼܼ‰Â!Ý!Ê Õ‰òÁÂÑÈÕÑÈï‹T$0‹l$81ê‹l$1ê‹l$$1ê‰õÑ ʼnT$0!Í”ܼ‰óÑÎ!à ݉ûÁÃÝ‹\$4ê‹l$<1ë‹l$1ë‹l$(ÑÎ1ëÑÉý‰\$4 õœ ܼ‰ù!Å!ñ ͉ÑÁÁÑÏÍÑÏë‹L$8‹,$1é‹l$1é‹l$,1é‰ÕÑÁ ý‰L$8!õŒܼ‰ÐÑÊ!ø ʼnØÁÀÅ‹D$<é‹l$1è‹l$1è‹l$0ÑÊ1èÑÀ‰Ý‰D$< Õ„0ܼ‰Þ!ý!Ö õ‰ÎÁÆÑËõÑËè‹4$‹l$1î‹l$ 1î‹l$41î‰ÍÑÆ ݉4$!Õ´>ܼ‰ÏÑÉ!ß ý‰ÇÁÇý‹|$î‹l$ 1ï‹l$$1ï‹l$8ÑÉ1ïÑljʼn|$ ͼܼ‰Â!Ý!Ê Õ‰òÁÂÑÈÕÑÈï‹T$‹l$1ê‹l$(1ê‹l$<1ê‰õÑ ʼnT$!Í”ܼ‰óÑÎ!à ݉ûÁÃÝ‹\$ ê‹l$1ë‹l$,1ë‹,$ÑÎ1ëÑÉý‰\$ õœ ܼ‰ù!Å!ñ ͉ÑÁÁÑÏÍÑÏë‹L$‹l$1é‹l$01é‹l$1é‰ÕÑÁ ý‰L$!õŒܼ‰ÐÑÊ!ø ʼnØÁÀÅ‹D$é‹l$1è‹l$41è‹l$ÑÊ1èÑÀ‰Ý‰D$ Õ„0ܼ‰Þ!ý!Ö õ‰ÎÁÆÑËõÑËè‹t$‹l$ 1î‹l$81î‹l$ 1î‰ÍÑÆ ݉t$!Õ´>ܼ‰ÏÑÉ!ß ý‰ÇÁÇý‹|$î‹l$$1ï‹l$<1ï‹l$ÑÉ1ïÑljʼn|$ ͼܼ‰Â!Ý!Ê Õ‰òÁÂÑÈÕÑÈï‹T$ ‹l$(1ê‹,$1ê‹l$1ê‰õÑ ʼnT$ !Í”ܼ‰óÑÎ!à ݉ûÁÃÝ‹\$$ê‹l$,1ë‹l$1ë‹l$ÑÎ1ëÑÉý‰\$$ õœ ܼ‰ù!Å!ñ ͉ÑÁÁÑÏÍÑÏë‹L$(‹l$01é‹l$1é‹l$1é‰ÕÑÁ ý‰L$(!õŒܼ‰ÐÑÊ!ø ʼnØÁÀÅ‹D$,é‹l$41è‹l$ 1è‹l$ ÑÊ1èÑÀ‰Ý‰D$, Õ„0ܼ‰Þ!ý!Ö õ‰ÎÁÆÑËõÑËè‹t$0‹l$81î‹l$1î‹l$$1î‰ÍÑÆ1݉t$01Õ´>ÖÁbʉÇÁÇÑÉïÑÉþ‹|$4‹l$<1ï‹l$1ï‹l$(1ï‰ÅÑÇ1͉|$41ݼÖÁbʉòÁÂÑÈêÑÈ׋T$8‹,$1ê‹l$1ê‹l$,1ê‰õÑÂ1ʼnT$81Í”ÖÁbʉûÁÃÑÎëÑÎÚ‹\$<‹l$1ë‹l$1ë‹l$01ë‰ýÑÃ1õ‰\$<1Åœ ÖÁbʉÑÁÁÑÏéÑÏË‹ $‹l$1é‹l$ 1é‹l$41é‰ÕÑÁ1ý‰ $1õŒÖÁbʉØÁÀÑÊèÑÊÁ‹D$‹l$ 1è‹l$$1è‹l$81è‰ÝÑÀ1Õ‰D$1ý„0ÖÁbʉÎÁÆÑËîÑËð‹t$‹l$1î‹l$(1î‹l$<1î‰ÍÑÆ1݉t$1Õ´>ÖÁbʉÇÁÇÑÉïÑÉþ‹|$ ‹l$1ï‹l$,1ï‹,$1ï‰ÅÑÇ1͉|$ 1ݼÖÁbʉòÁÂÑÈêÑÈ׋T$‹l$1ê‹l$01ê‹l$1ê‰õÑÂ1ʼnT$1Í”ÖÁbʉûÁÃÑÎëÑÎÚ‹\$‹l$1ë‹l$41ë‹l$1ë‰ýÑÃ1õ‰\$1Åœ ÖÁbʉÑÁÁÑÏéÑÏË‹L$‹l$ 1é‹l$81é‹l$ 1é‰ÕÑÁ1ý‰L$1õŒÖÁbʉØÁÀÑÊèÑÊÁ‹D$‹l$$1è‹l$<1è‹l$1è‰ÝÑÀ1Õ‰D$1ý„0ÖÁbʉÎÁÆÑËîÑËð‹t$ ‹l$(1î‹,$1î‹l$1î‰ÍÑÆ1݉t$ 1Õ´>ÖÁbʉÇÁÇÑÉïÑÉþ‹|$$‹l$,1ï‹l$1ï‹l$1ï‰ÅÑÇ1͉|$$1ݼÖÁbʉòÁÂÑÈêÑÈ׋T$(‹l$01ê‹l$1ê‹l$1ê‰õÑÂ1ʼnT$(1Í”ÖÁbʉûÁÃÑÎëÑÎÚ‹\$,‹l$41ë‹l$ 1ë‹l$ 1ë‰ýÑÃ1õ‰\$,1Åœ ÖÁbʉÑÁÁÑÏéÑÏË‹L$0‹l$81é‹l$1é‹l$$1é‰ÕÑÁ1ý‰L$01õŒÖÁbʉØÁÀÑÊèÑÊÁ‹D$4‹l$<1è‹l$1è‹l$(1è‰ÝÑÀ1Õ‰D$41ý„0ÖÁbʉÎÁÆÑËîÑËð‹t$8‹,$1î‹l$1î‹l$,1î‰ÍÑÆ1݉t$81Õ´>ÖÁbʉÇÁÇÑÉïÑÉþ‹|$<‹l$1ï‹l$1ï‹l$01ï‰ÅÑÇ1͉|$<1ݼÖÁbʉòÁÂꋬ$€ÑÈ×ÑÈ‹U Ê‹Mñ‰Æ‹E‰U ø‹}ß‹]ó‰E‹´$„‰]Æ@‹D$D‰}9ƉMŒ/ïÿÿÄl_[]^ËL$ VÁá‹t$ UñS‹l$W‹U ìl‹}‹]‰L$D‹‹N‰$‰L$‹F‹N ‰D$‰L$ ‹F‹N‰D$‰L$‹F‹N‰D$‰L$‹F ‹N$‰D$ ‰L$$‹F(‹N,‰D$(‰L$,‹F0‹N4‰D$0‰L$4‹F8‹N<‰D$8‰L$<éïÿÿÌSV‹t$W‹|$‹^ ‹G 3ÃtF…Ût‹Æ‹÷‹øWVèz®þÿƒÄ…À}V‹t$WVè7ƒÄ …Àu6_^[ÃWV‹t$Vè ƒÄ …Àu/_^[ÃWV‹t$Vè9ƒÄ …Àu_^[Ã…ÛtÇF _^¸[ÃÇF _^¸[ËD$ SUV‹PW‹|$‹O;Ê} ‹Ï‹ø‰L$‹Á‹o‹t$‹X‹NE;Á‹Æë PVè1©þÿƒÄ…Àu_^][ËT$‰n‹?‹6‹SPWVèž] ƒÄñù…À‹Ót+;Ý}‹BƒÇƒÆH‰Nü;Ès;Õ|é‹D$ǃÆÿ@;÷t;Õ}+ꋃljƒÆMuó‹L$_^]ÇA ¸[øè–x‹D$SU‹l$VW‹]‹x;߉\$ ‰|$}"h¶hFjdjsjèãþÿƒÄ3À_^][ƒÄËt$;^‹Æë SVèB¨þÿƒÄ…Àu_^][ƒÄËL$$‹E‹3ö‹)3É…ÿ~f‰|$$‹Ï‹8‹]ƒÀƒÅ…ö‰\$t;ßöƒËÿ+\$Fûë;ûö÷Þ+û‰:‹|$$ƒÂO‰|$$uÅ‹\$ …öt9\$}‹0AƒÀƒÂ~ÿ‰zü;÷w;Ë|é‹t$;Ðt?‹ùA;û}8‹8‰:‹ùA;û}-‹x‰z‹ùA;û} ‹x‰z‹ùA;û}‹x ƒÀ‰z ƒÂ‹ùA;û|È…Û‰^ÇF ~‹\šü‹ƒë…Àu ‹NI‹Á‰N…Àê_^]¸[ƒÄÃS‹\$ V‹t$‹C W…À‹F t*…Àt‹Ã‹Þ‹ð‹C‹N;Á‹Á‹|$;G4‹Çë:¿ë…ÀtÜ3ÿV‹t$SVèoýÿÿƒÄ …Àu_^[É~ _^¸[ÃPWèÁ¦þÿƒÄ…Àu_^[ÃVSè?«þÿƒÄ…À}#SVWèþÿÿƒÄ …Àu_^[ÃÇG _^¸[ÃVSWèÝýÿÿƒÄ …Àu_^[ÃÇG _^¸[ËD$‹L$V‹t$W‹|$PWQVjèSƒÄ…Àu_^ËF …Àu_¸^ËG …À¸pÊCu¸ÇCWVVÿÐƒÄ _^ÃSUVW‹|$$3íWèÐŒÿÿWèêŒÿÿ‹ðƒÄ…öto‹D$‹L$;ÁWuPVè½iƒÄ …ÀtTëQPVèL*ƒÄ…ÀtC‹\$ WSV‹t$ Vj貃Ä…Àt)‹F …Àt‹C …À¸pÊCu¸ÇCSVVÿÐƒÄ …Àt½WèÌŒÿÿƒÄ‹Å_^][ËD$‹T$ VP‹H<‹D$RPÿQ‹ðƒÄ …öu‹L$^‰ÃT$RVènbÿÿ‹L$ V‰è’bÿÿƒÄ ¸^ËT$‹D$R‹T$‹Hƒøu ‹ƒ8„.‹t$dQVèH©þÿƒÄ…À}:‹D$`…ÀtVPè’¥þÿƒÄ…À„‹D$\…Àt jPèg¦þÿƒÄ_^]¸[ƒÄHËt$lVèM‹ÿÿVèg‹ÿÿV‰D$$è]‹ÿÿ‹øV‰|$,èQ‹ÿÿ‹\$lƒÄ‹è…Û‰l$u Vè:‹ÿÿƒÄ‹Ø…í„……Û„}‹L$‹T$hRÇA è@¡þÿ%€yHƒÈà@¾ +ð‹D$lVPUè-ƒÄ…À„:‹L$dƒÆ VQWÇE ‰t$<è\-ƒÄ …À„ÇG ‹‹mT$D‹÷R‰l$,+õèâ¡þÿ‹D$ µƒÄ‹‰l$HщT$D‹H‹T$A‰L$Lƒý‹ ‹T©ü‰T$ u ÇD$ë‹L©ø‰L$‹‹L$hDºü‹Q ‹K‰D$\‹D$d‹x F3×;Á‰S ‹Ãë PSè)£þÿƒÄ…À„r‹ ‰sE|±ü‹L$;A‹Áë PQèþ¢þÿƒÄ…À„G‹T$D$DRPèt§þÿƒÄ…À|4‹L$T$DQD$HRPè)úÿÿƒÄ …À„Ç‹K‹ÇDŠüëÿK‹K3À;Èu‰C ƒïN;ð‰|$h‰D$$‰t$,Ž„‹L$\‹|$ ‹‹qü;ÇuƒËÿé…3Ò3É ÂR ÎWPQè¨s‹L$‹Ø¯Ç3í+ðUQUSè‚t‰D$4‹D$\3ÿ‹Î‹@ø‰D$< ø3À È;Ñr=w9|$4v5‹D$ Kð;ðr*‹L$‹|$4‹D$<+ù‰|$4‹ÎÕ3ÿ ø3À È;ÑwÓr9|$4wË‹l$(‹T$‹t$SU‹‹PQè¤S‹|$T‹T$XƒÄƒïB‰|$D‰T$H‹‰ªE…À~‹Lüƒ9uHƒé…Àó‰F‹|$HT$DVD$HRPèRúÿÿƒÄ …À„Ë‹t$‹L$H+Ï‹VщV‹D$P…Àt2‹T$‹|$HD$DRL$HPQKè4÷ÿÿƒÄ …À„‹T$H‹F+׉F‹D$h‹L$,‰ƒè‰D$h‹D$\ƒÀü‰D$\‹D$$@;Á‰D$$Œ|þÿÿ‹t$`…öt0‹T$0‹D$‹L$dRPV‹y è¯+‹FƒÄ …Àtƒøu‹ƒ9t‰~ ‹T$lRèˆÿÿƒÄ¸_^][ƒÄHËt$lVèˆÿÿƒÄ3À_^][ƒÄHÃhÁhFjgjkjèþÿƒÄ_^]3À[ƒÄHÃSV‹t$WV3ÛèA‡ÿÿVè[‡ÿÿ‹øƒÄ…ÿtI‹D$‹L$;ÁVuPWè.dƒÄ …Àt.ëQPWè½$ƒÄ…Àt‹D$‹L$VPWQè%ƒÄ…Àt»Vèc‡ÿÿƒÄ‹Ã_^[øèæoSUV‹t$0W3íV‰l$貆ÿÿVè̆ÿÿ‹ðƒÄ;õ„‹D$,PV褠þÿƒÄ…À„‹D$0X‹™‹{ƒâ‰\$ Áø‰D$‰|$„ø;ý„ðl‹F;è‹Æë UVèdŸþÿƒÄ…À„¶‹D$(;h~ UPèIŸþÿƒÄ…À„›‹T$,‹K 3J ‰N ‹‹‰D$‹F;Å<»}‹@;ÅÇDü|ñ‹T$0‹D$‰n‹j@…À~c‰D$,ë‹D$‹ ‹T$¯ÍQPRSè‚N‹ƒÇЃÄ‹ÊƒÃ;ȉWüs&‹@‰u‹G@‰Gu‹OGA‰u ‹HƒÀA‰tõ‹D$,H‰D$,u£‹F…À~‹Dü‹ƒè…Òu ‹VJ‹Ê‰V…Éê‹l$(‹F ‹U‰E ‹‹D$‹v‰T$;ð‰\$}3öë+ð‰uƒî3ÿ…ö~ZJ +Ó‰T$,VÁêC<•‰|$‹h‹xü‹‰l$0‹høƒÀ‰iô‰yø‹|$,ƒÁJ‰\ð‹|$0‰yðuÓ‹l$(‹|$‹T$‹\$ƒÆ;þ}‹Ëº+Ê+÷‹‰ƒÀNuõ‹t$ VUèQ¢þÿƒÄ…À|VUUèõÿÿƒÄ …ÀtÇD$‹D$4Pèù„ÿÿ‹D$ƒÄ_^][ƒÄÉn_^]¸[ƒÄÃVhñh4FjHèÞþÿ‹ðƒÄ …öu^ÃFÇPè„›þÿNQè{›þÿV,Rèr›þÿƒÄ ÇFD‹Æ^ÃV‹t$…öt.FPè›þÿNQè›þÿV,RèüšþÿŠFDƒÄ ¨t VèìþÿƒÄ^ø0èÖlSVD$WPè ›þÿ‹|$D‹\$HSGwP‰D$Lè þÿSÇG$èÓ™þÿƒÀj™ƒâVÂÁøÁà‰èjžþÿƒÄ…À„5j Vè÷¡þÿƒÄ…À„"‹ ‹\$HSD$‹L$,‰T$QT$VRÇD$ ‰D$8ÇD$<ÇD$@ÇD$Dè׃ÿÿƒÄ…À„ÒD$j L$PQè›%ƒÄ …À„¶‹D$…Àt'ƒøu ‹T$ƒ:tD$jPèþ(ƒÄ…À„‰ëL$jÿQè¥þÿƒÄ…ÀttT$(SD$RPL$ jQè·öÿÿƒÄ…ÀtV‹D$…À~‹T$‹ë3À‰G@D$Pè™þÿjVèYþÿƒÄ …Àt(‹ÑáQVèç þÿƒÄ…Àt‹T$@SRVVjèaöÿÿƒÄ…Àu _^3À[ƒÄ0Ã_^¸[ƒÄ0ø0è&k‹„$HS3ÛV‹W‰\$$‰\$0Љ\$(¨‰\$ u$h‰hLFjfjvjèmþÿƒÄ3À_^[Ä0Ë”$HRè˜þÿ‹ð‹„$TPèò—þÿƒÄ;ó‹øu ;ûu‹Œ$@jQ膜þÿƒÄ_^[Ä0Ã;÷‰t$‰|$‹œ$XUSè_ÿÿSèyÿÿ‹èS‰l$ èmÿÿƒÄ ‰D$‹„$`…í„Q‹L$…É„E…Àt‰D$ë+èÌüÿÿ…À‰D$„M‹”$XSRPèAýÿÿƒÄ …À„"þŸ¸½¹~‰D$ ë*þï~‰l$ ëƒþO~‰L$ ë3ÒƒþžÂJƒâB‰T$ ÿŸ&ÿï~‰l$$ëƒÿO~‰L$$ë3ÀƒÿžÀHƒà@‰D$$L$@QèÓ—þÿ‹´$LƒÄÇD$4‹F …Àu‹”$XRVèüþÿƒÄ…À|%‹„$XSPL$HVQjè_ôÿÿƒÄ…À„>t$@‹F…À„ƒøu ‹ƒ:„ ‹|$SWD$HoUVPè øÿÿƒÄ…À„ÿƒ|$ ~~‹D$SL$DWT$HQRPèxøÿÿƒÄ…À„׋L$ ¿I»Óç;û~9t$TVèþ–þÿ‹”$`‹D$‹L$RPVìQRVè2øÿÿƒÄ…À„‘CƒÆ;ß|Ë‹|$‰\$4‹œ$\„$ÀPè³–þÿ‹´$TƒÄÇD$,‹F …Àu‹Œ$XQVèÜœþÿƒÄ…À|+‹”$XSR„$ÈVPjè<óÿÿƒÄ…À„´$À‹F…À„çƒøu ‹ƒ9„×SWU”$ÌVRè~÷ÿÿƒÄ…À„݃|$$Ž…‹T$S„$ÄWŒ$ÈPQRèL÷ÿÿƒÄ…À„«‹D$$¿»HÿÓç;û~<´$ÔVèÍ•þÿ‹Œ$`‹T$‹D$QRNìPQVè÷ÿÿƒÄ…À„`CƒÆ;ß|ˉ\$,‹œ$\‹T$S3öRUÇD$D3ÿ‰t$H‰t$<è”þÿP‹D$(Pè¸öÿÿƒÄ…À„‹L$Aÿ…À‰D$Œ½H‰D$‹L$8‹D$…Éu‹T$SRPPPè{öÿÿƒÄ…À„Ú‹l$…ÿuv‹„$LUPè þÿƒÄ…Àta‹T$ ‹œ$L‹ý+úGWSèìœþÿƒÄ…ÀuGWSèÝœþÿƒÄ…Àtñ‹\$‹ï;݉l$<¿|‹Œ$LSQÑç賜þÿƒÄ…ÀtGK;Ý}ã‹l$…öum‹œ$TUSèœþÿƒÄ…ÀtX‹T$$‹õ+òFVSèyœþÿƒÄ…ÀuFVSèjœþÿƒÄ…Àtñ‹\$‹î;݉l$0¾|#‹”$TSRÑæè@œþÿƒÄ…ÀtFK;Ý}ãë‹l$0‹\$…ÿt?;\$èýÿƒÄ3À[ËT$+ÃUƒèVÆB‹ð‹ÎWÆB‹éƒÈÿ‹úÖÁéó«‹Í‹t$ƒáóª‹ËÆz‹ÑÁéó¥‹Ê¸ƒáó¤_^][ËL$‹T$VA;Ð…Ì‹D$Šp€ú…ºAÿ3É…À~ €>ÿu$FA;È|õ;ÈuuFëÚjqhÄFjfjpjènçýÿƒÄƒÈÿ^Ãù}h€hÄFjgjpjèLçýÿƒÄƒÈÿ^ÃÊÿ+Ñ‹L$ Â;Á~h‡hÄFjmjpjè çýÿƒÄƒÈÿ^ËÈW‹|$ ‹ÑÁéó¥‹Êƒáó¤_^ÃjdhÄFjjjpjèîæýÿƒÄƒÈÿ^ËD$SU‹l$HõV;éW~h—hÄFjnjmjè¸æýÿƒÄ3À_^][ËL$+ŃèyÆ‹ðÆGVWè þÿƒÄ…À_^]3À[Ã3Û…ö~€?ujWèá þÿƒÄ…À~߀?tìGC;Þ|á‹t$‹Í‹ÑÆG¸Áéó¥‹Êƒáó¤_^][ËL$‹T$VA;Ð…®‹D$Šp€ú…œAÿ3É…À~ ŠF„ÒtA;È|ô;ÈuhÌhÄFjqjqjèÜåýÿƒÄƒÈÿ^Ãù}hÒhÄFjgjqjèºåýÿƒÄƒÈÿ^ÃÊÿ+Ñ‹L$ Â;Á~hÙhÄFjmjqjèŽåýÿƒÄƒÈÿ^ËÈW‹|$ ‹ÑÁéó¥‹Êƒáó¤_^Ãh¾hÄFjkjqjèYåýÿƒÄƒÈÿ^øèÆNSVW‹|$,‹Ç™+‹ðÑþƒÿu‹D$(‹L$$‹T$ PQRè 7ƒÄ _^[ƒÄÃÿ} ‹D$(‹L$$‹T$ WPWQR舃Ä_^[ƒÄÃU‹l$(VDµPU‰D$$èé„þÿ‹Ø3À‰D$(‰D$‹D$8VP °Q‰L$,èÊ„þÿ [‹\$LƒÄDƒø‡ªÿ$…öC‹T$VURSèŽ4‹D$$‹L$…À~0U‹ƒÇƒÁ, êÁè‰iü‹Ð‹FC;Ø|ã…Ò]t ‹D$Çÿ@_^¸[ËF‹K@;Á‹Ãë PSèWwþÿƒÄ…Àuš^[ÃS‹\$ V‹C…À„™ƒøu ‹ ƒ9„‰‹t$ ;Þt&;F‹Æë PVèwþÿƒÄ…Àu^[ËS‰V‹C ‰F ‹CU‹.3ÒW‹;Hx L…+ýX‹ƒé‹èÑí ê‰iÁàK‹Ðué‹F_…À]~3‹Dü‹ƒè…Òu$‹VJ‹Ê‰V…Éê^¸[ËD$ jPèjxþÿƒÄ^¸[øèfF‹L$ UV‹t$W‹|$‹G ‰A ‹Æ™ƒâ‹W‹èÁýD*‹Q;‹Áë PQè+vþÿƒÄ…Àu_^]ƒÄÃæ€SyNƒÎàF‹L$‹» ‹‹OÍ+Þ…öÇŠ‹‰T$uOxh /¸w Š‹8ƒè‰9ƒéNuóëMOxJ¸ /G‰D$$DЉ|$‹T$$‹ËƒÀü‹‹úÓï‹H ωH‹ÎÓâ‹L$‰‹T$$ƒêI‰T$$‰L$uÍ‹T$‹Í3À‹ú[ó«‹D$‹H‹D$l)…í‰h~‹Lªü‹ƒé…Òu ‹pN‹Ö‰p…Òê_^¸]ƒÄøè&E‹L$S‹ÁU™ƒâV‹ًðWÁþã€yKƒËàC‹|$¸ +ÉD$‹G;ðå…À„Ý‹l$;ït-‹G ‰E ‹O+ÎA‹M;Á‹Åë PUè¸tþÿƒÄ…Àu_^][YÃ…É„¯‹‹O+β‹U…Û‰MuA…É~R‹0ƒÀ‰2ƒÂIuóëC‹8ƒÀƒù~/I‰L$ ‹÷‹8‹Ë‹ïÓî‹L$ƒÀÓå‹L$ ƒÂ îI‰jü‰L$ uÚ‹l$‹ËÓïƒÂ‰züÇ‹E…À~7‹MDü‹ƒè…Òu'‹UJ‹Ê‰U…Éê_^]¸[YËD$jPè×uþÿƒÄ_^]¸[YÃS‹\$W‹{…ÿu_3À[Ã3ÉO…ÿV|'U‹l$‹U‹4¸VQè,(‹È‹¯ÍƒÄ +ñ‰ºO‹Îyß]‹C…À~‹‹t‚ü…öuH‰C^_‹Á[ÃV‹t$‹F …Àt7‹D$ ÇF PVè‚‹NƒÄ…Étsƒùu‹ƒ9tg‹N 3Ò…É”‰V ^ËF‹N@;Á‹Æë PVè'sþÿƒÄ…Àu^ËT$ W3É;N|‹Âë‹‹ˆ‹>;ЉvºAëß‹F_;È|@‰F¸^ÃV‹t$‹F…Àt~ƒøu‹ƒ9tr‹N …Éukƒø‹D$ u‹‹;Ðs+‰ÇF ¸^ËW3É‹:;øs+øA‰:‹¸‹<ŠŠ;ørê‹‹<ŠŠ+ø‰:‹_ƒ<ˆu ‹FH;Èu‰F¸^ËL$ ÇF QVèÄþÿÿƒÄÇF ^ÃV‹t$W‹N…Ét]‹T$…ÒuRVèôsþÿƒÄ¸_^ËRQPPèÓ#‹øƒÄ…ÿt/‹F‹N@;Á‹Æë PVèßqþÿƒÄ…Àu_^ËF‹‰<‹F@‰F_¸^ø4è¦AV‹t$‹ÐÁê€â€Êøˆ‹ÐÁê€â?A€Ê€ˆ‹ÐÁê €â?A€Ê€ˆ‹ÐÁê€â?A$?€Ê€ €ˆˆA¸Ãú}ƒÈÿÃ…ÉtL‹ÐÁê€â€Êüˆ‹ÐÁê€â?A€Ê€ˆ‹ÐÁê€â?A€Ê€ˆ‹ÐÁê €â?A€Ê€ˆ‹ÐÁê€â?A$?€Ê€ €ˆˆA¸ø@‘Fø°‘Føø‘Føh’Føø’Føˆ“FøГFø0”Fø¸”Fø@•Fø–FøX–FøPèF8SUVW‹|$h…ÿu _^]3À[ƒÄPË‹o3É3ö…À~e‹\$dŠ.<~< }< t< uˆD ëÆD .AƒùP|D$QPSè ÿÿƒÄ …À~ 3É‹F;ð|À…É~QL$QSèï ÿÿƒÄ …À _^]3À[ƒÄPÃ_^]¸[ƒÄPøè¦7‹D$3ÒSU‹‹@ƒù ‰T$‰T$ Œ€|ÿZuÇD$Š €ù9€ù0ŒøBƒú |å¾¾P ‰ J¾P ‰ J¾P ‰¬J°/ÿÿ¾H¾P ‰”Jðýÿÿƒú ²ƒúŒ©¾HVW¾p¾x ‰¾X ´Nðýÿÿ¾H ‰¼Oðýÿÿ¾H ‰œKðýÿÿŠH €ù0|"€ù9Š@ <0|<9¾É¾À ‰ŒHðýÿÿë‹L$‹D$…À¸Ð™Fu¸õIPUQ‹ •°I‹T$(SWVQh´™FRè.þÿƒÄ$3É…À_^ŸÁ]‹Á[ƒÄËT$jh¤™FRè{ ÿÿƒÄ 3À][ƒÄøèF6‹D$U‹l$ VW¾Nj+õjPÇD$ÇD$‰t$ èãýÿ‹øƒÄ ‰|$€?uWèáýÿƒÄ¸_^]ƒÄËl$ GS‰t$(‹ßŠ€ù/u ŠG3ÀjŠE‹ÈƒàÁ銀à™FŠ‘à™FL$0QVˆT$8ˆD$9ÿÓƒÄ …Àt2‹T$(E;èu‹D$(4Wè²×ýÿƒÄ…ö|F…À}_^]ƒÈÿ[ƒÄÃÎÿëÜ‹L$0_^]Á[ƒÄÿöÁt…ÿu¿ëƒÏ‹D$‹MjT$SR‹UPWQR裋L$LƒÄ…É} _^]ƒÈÿ[ƒÄÃÈŠD$„À‰L$0tƒÁ‰L$0…öu _^]‹Á[ƒÄÄÀtjh óHVÿÓƒÄ …Àu _^]ƒÈÿ[ƒÄËD$‹M‹UVSjPWQRè3ŠD$/ƒÄ„Àtjh óHVÿÓƒÄ …Àu _^]ƒÈÿ[ƒÄËD$0_^][ƒÄøè¦+‹D$‹L$ SUV4W;Æ‹ø‰t$ÇD$„E‹l$4ƒå‰l$ë‹D$,;ø•ÃKƒã ƒýwwÿ$­pD3À3ÒŠ3ÉÁàG‰D$ŠÁâ ÂG‰D$3ÒŠ/ ÁG‰D$Š ÂG‰D$ëB3À3ÉŠ'G‰D$Š ÁG‰D$ë,3ÀŠG‰D$ë!‹D$0T$RPWèxíÿÿƒÄ …ÀŒ¦ø‹D$;þu³@öD$4tjPL$$jQèðÿÿ‹èƒÄ 3ö…í~6 \$8‹T$D‹D$@‹L$«ýÿ‹ðƒÄ …öt‹D$VÿPƒÄ…Àu Vè ­ýÿƒÄ3À^ËÆ^ËD$…ÀuÃÇ`µIÇ@X±IÇ@¸ËD$…ÀuÃLjµIÇ@X³IÇ@¸ÃV‹t$…ötVèVè­ýÿƒÄ¸^Ã3À^ËD$…ÀuÃPèуĸËD$VhØÏHPèÀÜþÿ‹ðƒÄ…öuIèšýÿ%ÿ=€uhÅhÜœFjrjdjè!˜ýÿƒÄ3À^ÃhÇhÜœFjjdjè˜ýÿƒÄ3À^ËL$‹T$WQVRèV‹øèeÕþÿƒÄ‹Ç_^ø4èFSUV‹t$D3í3Û‹FW‰\$,‰l$ ‰l$‰D$0èBwþÿ‹ø…ÿ‰|$uhähÜœFjjfj胗ýÿƒÄéÍhèhÜœFj èj©ýÿ3íƒÄ ;ʼnD$u hëéy‹ DoFV‰‹D$‹HoF‰PèX ƒÄ…Àu hòéM‹L$QVè<ƒÄ;ʼnD$(uhúhÜœFjgé-hW‰l$$‰l$,è wþÿƒÄ…À„„ë3í‹T$‹\$‹D$Lhÿ‹rÆóVPè­Öþÿ‹þƒÉÿ3ÀƒÄ Ɔÿò®÷ÑI‹Ñu 9l$$„I3ÿ;͉|$$~ŠDÿ< t< uI;Íï;Õt;Êu ¿‰|$$ë ‹D$,Æ1@‰D$,Ù‰l$ ƒû‰\$|>‹L$‹Q‹L$H‹IDÿ3ÒŠöQ t"ƒû~ 3ÒŠPÿöQ uKÇD$$‰\$é“;ý…‹‹D$‹L$H3ÒÇD$‹p‹I‹ÆŠf‹QöÆ…öÂt@3ÒŠf‹QöÆtíéꊋúçÿf‹yöÀ‰\$…ÏöÇt?@¾úŠ‹ÚãÿöYu"¾Ò;×u ¾P;×u@ŠP@‹ÚãÿöYtÞ¾;×urëoŠ\$öÃ@tL@¾úŠ‹Úãÿf‹YöÃu,¾Ò;×t%öà t @3ÒŠöQu9ŠP@‹Úãÿf‹YöÃtÔ¾;×uëöà t3ÒŠPöQu ƒÀëöÃu@Š‹úçÿf‹yöÀ‰\$„1ÿÿÿÆ‹D$H3ÉŠ‹@f‹ HöÁtöÁuF3ÒŠf‹ PöÁu튋ÑâÿöP…"€ù[…â~3ÉŠf‹ HöÁtöÁuG3ÒŠf‹ PöÁuí‹÷‹Î3ÒŠf‹Pö t3ÒŠQöPtAëåƒÁëà÷ÂtAëÕ3Ò‹ñŠf‹PöÂtöÂuF3ÒŠf‹PöÂu튀ú]t „Ò„ïë D$Æ‹L$HWPjQèíƒÄ…À„+‹T$‹t$HRVèƒÄ‰D$(…À…V‹D$PVèé ƒÄ‰D$(…À„£é7ÇD$‹Î3ÒŠf‹Pö t3ÒŠQöPtAëåƒÁëà÷ÂtAëÕŠ‹Á€ú:uD€y:u>‹|$HA‰t$Æ‹ð‹O3ÒŠf‹Qö t3ÒŠPöQt@ëâƒÀëÝ÷Ât@ëÒ‹|$H‹3ÒŠ‹Èf‹WöÂtöÂuA3ÒŠf‹WöÂuí€9=…øÆA‹L$H3ÒŠ‹è‹If‹QöÃt‹ÓöÂuE3ÒŠUf‹QöÂuìöÃu @3ÒŠöQtõH;Åt3ÒŠöQtH;Åuñh|hÜœFj Æ@è–¤ýÿ‹ØƒÄ …Û‰\$ „Š‹D$…Àu‹D$‰D$‹þƒÉÿ3Àhƒò®÷ÑhÜœFQèZ¤ýÿ‹ÐƒÄ ‰SƒÃ…ÒÇ„M‹þƒÉÿ3ÀUò®÷Ñ+ùS‹Á‹÷‹ú‹T$PÁéó¥‹Èƒáó¤‹L$ QRèƒÄ…À„?‹|$‹t$‹ÇŠŠŠÊ:Óu„ÉtŠPŠ^ŠÊ:ÓuƒÀƒÆ„ÉuÜ3ÀëÀƒØÿ…Àt&‹t$HWVèðƒÄ…ÀuWVèÒ ƒÄ…À„ºë‹D$(‹t$H‹L$ QPVèaƒÄ …À„§ÇD$ ‹T$‹D$ÂRPè‰qþÿƒÄ…À…~úÿÿhhÜœFjë}‹L$Qè&qþÿ‹D$ƒÄ;Åt Pèµ¥ýÿƒÄ_^]¸[ƒÄ4ÃhMhÜœFjdëDhWhÜœFjgë6hnhÜœFjeë(hëhˆëh–hÜœFjgë h¤hÜœFjAjfjèÊýÿƒÄ‹T$Rèpþÿ‹l$$‹t$L‹\$0ƒÄ‹D$…Àt Pè ¥ýÿƒÄ‹D$P…Àt‰SD$8h¨FPÿFL$@QhøœFjèÁ˜ýÿ‹F‹L$HƒÄ;Èt…ÀtPè™ÓÿÿƒÄÇF…ít)‹E…Àt P辤ýÿƒÄ‹E…Àt P认ýÿƒÄU襤ýÿƒÄ_^]3À[ƒÄ4ø è†ùSUV3íW‰l$‰l$è“oþÿ‹Ø;݉\$„u‹t$@ƒÉÿ‹þ3Àò®÷ÑQS‰L$4èëoþÿƒÄ…À„GŠ‹|$4‹Ð‹Oâÿf‹QöÂ@t¾ÀF‰D$@Š‹Ðâÿf‹QöÂuG¾Ø;\$@tQö tŠFF‹ÐâÿöQu:‹\$EF‹KˆD)ÿŠ‹O‹Ðâÿf‹QöÂt½‰l$¾;D$@…wÿÿÿFéqÿÿÿ‹\$‰l$ëãöÆtj¾ÐŠFF‰T$@‹ÐâÿöQu6¾È‹D$@;Èu ¾V;Ðu)F‹CŠˆ (ŠFE‹OF‹ÐâÿöQtΉl$‹D$@ë‰l$¾;Ð…þþÿÿFéøþÿÿö tvŠFFˆD$ F‹T$ âÿöQ…¾3À‹þó«‰.‰^ ÇF ÇFP‰^‰^ÿUP‰F$¹ 3À~4‰^(‰^,‰^0‰žèó«ÇF`‰žô‰ž”‰^d‰^hdž¤‰ž¬‰ž°‰ž´‰ž¸Ç†¼ÿÿÿÿ‰žÀ‰žäè7w;Ɇ¨„óhÀaDhaD‰^l‰^p‰^tèÔýÿƒÄ;ÉF„Íè{þÿ;ÉF „½‹F~hDFPWQ莋?ƒÄ;û„ÐWèKÂýÿƒÄ…ÀŽ¿hœFè‚ýÿƒÄ;Ɇ€uh\h4Fhñé£hFèÛýÿƒÄ;Ɇ„uhah4Fhòë{h„Fè³ýÿƒÄ;Ɇˆuhfh4FhóëSè°½ýÿ;Ɇ˜uhth4FjAë6VxRVjèœSþÿƒÄ ‰žŒè>'‰†‹Æ_^][ÃhVh4Fh¡h©jè¶výÿƒÄ;ót V艃Ä_^]3À[ËD$3É3ÒŠhKŠPIŠHJÁá Ê3ÒŠPHÁá Ê‹ÁËD$‹T$V‹‹2;Ît¸^ËHD‹rD;Ît¸^ÃWpHzH3Àó¦_tÀƒØÿ^ÃV‹t$…ö„Ùh…h4Fj F`jÿPèìËýÿƒÄ…À·‹F…Àt jVèRƒÄNxQVjèóRþÿ‹FƒÄ …Àt Pè³ÒýÿƒÄ‹F …Àt PèÓyþÿƒÄ‹F…Àt Pè#ÀýÿƒÄ‹F…Àt PèÀýÿƒÄ‹†¨…Àt Pè0wƒÄ‹†˜…ÀthP^BP蘿ýÿƒÄ‹†Œ…ÀthîAP耿ýÿƒÄVdž轉ýÿƒÄ^ËL$‹D$‰AlËL$‹D$‰ApËD$‹L$‹T$ ‰ˆ¸‰äÃUV‹t$ W‹®¼‹ED…À„Ä‹†Ü‹L$S‹X ‹û#ùtn‹Nh…ÉugöÇuUPè ƒÄ…ÀtT‹†Ü‹H(…ÉtG‹Ž¼hŒh4FjÁœjQèmÊýÿ‹†¼‹–ÜPVÿR(ƒÄ…Àu‹Ž¼Q詃ÄöÀ[u<‹D$;øu4¨t ‹–Ü‹B<ë ‹†Ü‹@H<ÿujÿÌF‹ŽÜPQè‡ƒÄ _^]ÃSV‹t$ W‹|$ƒËÿ‹N¸;ÏtGU‹n …ít ‹Q3Û;ê”Ë‹/;Õ]u‰~ëVÿQ V‰~ÿWƒÄƒûu ‹O_‰N ^[Ã…Ûu‹W‰V _^[ÃVW‹|$…ÿ~_3À^ÃèzýÿƒÄ‹†´…Àt Pè»®ýÿƒÄhÈVèþÿVè§xýÿƒÄ 3íéÿÿÿSUVW‹|$3í…ÿ„:‹GD…À„/hæhÐFj j èиýÿ‹\$$W‹CPè¢Ãýÿ‹ðƒÄ;÷u‹KWQ½èjÂýÿWS‹ðèQƒÄhîhÐFj j 苸ýÿƒÄ…í„ÅdžŒ‹C,…ÀtVSÿЃÄ…ö„¥hhÐFj–œjÿRèF¹ýÿƒÄ…À€†¸PVjè\@þÿNjQè‘þÿVj0Rè†þÿFHj Pè{þÿ‹†ƒÄ$…Àt PèHfƒÄ‹†”…Àt PèåxýÿƒÄ‹†´…Àt Pèb­ýÿƒÄhÈVè4þÿVèNwýÿƒÄ _‹Å^][Ã_^]3À[ÃV‹t$…ö„¥hhÐFj†œjÿPèy¸ýÿƒÄ…À€Ž¸QVjè?þÿVjRèÄþÿFj0Pè¹þÿNHj Qè®þÿ‹†ƒÄ$…Àt Pè{eƒÄ‹†”…Àt PèxýÿƒÄ‹†´…Àt P蕬ýÿƒÄhÈVègþÿVèvýÿƒÄ ^ÃS‹\$ VW‹|$…Û„g‹‡Ü‹R‹ÿQLƒÄ…Àu4‹ ‹GQÿPLƒÄ…Àu$h)hÐFhðhÃjèaýÿƒÄ3À_^[Ã;Gt.PWèxíÿÿƒÄ…Àu_^[Ë—Ü‹B$…Àu WèºâÿÿƒÄ‰ƒ hChÐFjƒœjPè7·ýÿ‹·¼ƒÄ…ö„¥hhÐFjŽœjÿQè ·ýÿƒÄ…À€–¸RVjè">þÿFjPèWþÿNj0QèLþÿVHj RèAþÿ‹†ƒÄ$…Àt PèdƒÄ‹†”…Àt Pè«výÿƒÄ‹†´…Àt Pè(«ýÿƒÄhÈVèúþÿVèuýÿƒÄ ‰Ÿ¼‹ƒ˜‰‡ä_^¸[Ë·¼…ö„¯hhÐFjŽœjÿQè>¶ýÿƒÄ…À€–¸RVjèT=þÿFjPè‰þÿNj0Qè~þÿVHj Rèsþÿ‹†ƒÄ$…Àt Pè@cƒÄ‹†”…Àt PèÝuýÿƒÄ‹†´…Àt PèZªýÿƒÄhÈVè,þÿVèFtýÿƒÄ LJ¼‹‡Ü‹O‹;Á„'ÿÿÿPWèëÿÿƒÄ…À…ÿÿÿ_^[ø èÉ‹D$‰D$‹@…À‰D$t\‹D$Vh¨hÐFj j ‰D$èG´ýÿ‹D$L$QhyD‹p Ç@ ‹T$$Rè…¿ýÿ‹D$(h­hÐFj j ‰p è ´ýÿƒÄ,^ƒÄ ÃV‹t$W‹|$‹G…Àt‹Ž¤‹– Ê;ÁŽÝ‹WVRè½ýÿ‹VPèvdžŒ‹?ƒÄ‹G,…ÀtVWÿЃÄ…ö„¥hhÐFjŽœjÿQ致ýÿƒÄ…À€–¸RVjè;þÿFjPèÒþýÿNj0QèÇþýÿVHj Rè¼þýÿ‹†ƒÄ$…Àt Pè‰aƒÄ‹†”…Àt Pè&týÿƒÄ‹†´…Àt P裨ýÿƒÄhÈVèuþýÿVèrýÿƒÄ _^ÃV‹t$‹†¼…À„€öF0…vVèíÿÿƒÄöÄ0…dVè{íÿÿƒÄöÄ@…RSU‹®ÜW‹¾¼3Û…ÿ„/‹GD…À„$hæhÐFj j èx²ýÿ‹EWPèN½ýÿ‹ðƒÄ;÷u‹MWQ»è¼ýÿWU‹ðèýƒÄhîhÐFj j è7²ýÿƒÄ…Û„ÅdžŒ‹E,…ÀtVUÿЃÄ…ö„¥hhÐFj–œjÿRèò²ýÿƒÄ…À€†¸PVjè:þÿNjQè=ýýÿVj0Rè2ýýÿFHj Pè'ýýÿ‹†ƒÄ$…Àt Pèô_ƒÄ‹†”…Àt Pè‘rýÿƒÄ‹†´…Àt Pè§ýÿƒÄhÈVèàüýÿVèúpýÿƒÄ _][¸^Ã3À^ËL$V‹±Ä…öt‹À…ÀtuW‹|$ W;òu%w;ÆuÇÇë?‰‹À‰Äë/W;Âu‰2‹Ä‰À뉆À‹‘À‹Ä‰‚ÄÇÄÇÀ_^ø èFÅ‹D$SVW‹¸¬…ÿ„…‹t$(…ötD‹€¨…Àt4‹ DJ…Ét*‰D$ D$ PQ膤ýÿƒÄ…À|‹ DJPQè2¦ýÿƒÄ‰ëÇ‹t$ …ö„-‹\$$…Û„!‹G %ð‡=€w^tL=t8= t=@…¢¸‹… J‰镸‹… J‰é‚3À‹… J‰ëu¸‹… J‰ëe=t?=tH=€uJ‹G=€t=u9¸‹… J‰ë/¸‹… J‰ë¸‹… J‰ëèÅê‰ëÇ‹G %=t=u¸‹…HJ‰ë3À‹…HJ‰ëǃ>tƒ;t _^¸[ƒÄ Ã_^3À[ƒÄ øè–ËD$ S3ÛUV;ÃW‰\$‰\$„j9ìµI„Éhõh¦Fjj èÍ®ýÿ¡ìµIƒÄ;ÄhÜZF‰ìµIè-dýÿhÔYF£ JèdýÿhØ\F£$Jèdýÿh\ZF£(Jèdýÿh ZF£,Jèñcýÿht6F£0Jèâcýÿh´5F£<JèÓcýÿhà\F£@JèÔcýÿhüWF£HJèÅcýÿƒÄ$£LJh÷h¦Fjj è®ýÿƒÄ‹5(J¡$J÷Þö‹ JæÀÿÿ‹4JÆ@÷ØÀ%àÿÿ ð¡LJ÷ÙÉáðÿÿÁ ñ‹ <J÷ÚÒâþÿ ò‹HJ÷ØÀ%ðÿ ð¡0J÷ÙÉá€ÿÁ€ ñ‹ ,J÷ÚÒâøÿ ò‹T$$÷ØÀ%ÿÿ ð÷ÙÉá€ÿÿÁ€ ñÎ(ÿRD‹øh h¦F‰|$$¿ÁàPè1jýÿ‹ÈƒÄ ;ˉL$u%h h¦FjAh¦jè XýÿƒÄ3À_^][ƒÄÃ3í…ÿ~;y‹L$$UÿQH3ɃÄ;Át9t…p u‰Gð‰Oü‰‰OôCƒÇ‹D$E;è|΋L$‹øSÿƒú~A$Jh܉(h‰hüƒÀJuï…Û~5‰L$ÇA‹D$Q‰P ›D‘ìT›ö‰D$ ‘‰H‹T$ÇB h½´h¦FPèQiýÿ‹èƒÄ …íu/‹L$Qè¾kýÿh"h¦FjAh¦jè&WýÿƒÄ3À_^][ƒÄËD$‹Í…Àt‹‰‹@ ƒÁ…Àuò¸žF=žFt…p u‰ƒÁƒÀ(=ø¤F|å‹t$0jhü¥FVÇ»ÿüFƒÄ …Àu,‹|$D$UL$PQWhDFè#ƒÆ‹ØƒÄ€>:uF…Ût-‹þƒÉÿ3Àò®÷ÑIt‹L$T$UD$RPQVèíƒÄ‹Ø‹|$UèÞjýÿƒÄ…ÛuWèÑjýÿƒÄ3À_^][ƒÄÃèßœýÿ‹Ø…ÛuWè³jýÿƒÄ3À_^][ƒÄËt$…öt‹F…Àt ‹RSèΟýÿƒÄ‹v …öuæWè~jýÿ‹|$,ƒÄ…ÿt‹…Àt Pèg ýÿƒÄ‰‹t$,…öt?‹…Àt PèN ýÿƒÄSè…›ýÿƒÄ‰…Àt!…ÿtƒ?thÐ\DPèH›ýÿƒÄ‹Ã_^][ƒÄÃSè ýÿƒÄ_^]3À[ƒÄø èö¾‹D$$SUV‹ðйW„À‰L$‰t$4„z<-uFÇD$‰t$4ëa<+uFÇD$‰t$4ëNt‹L$ëF‰t$4Š„À…†üÿÿ_^]‹Á[ƒÄ ËD$_^][ƒÄ øè6»‹L$(‹T$,SU‹VW‹:…ۋËó‰|$„wë‹t$‹T$‹L$0;„M‹V ‹ÆƒÆ ‰T$‹ƒùÿu;‹J ‹l$ ‹R#Í#T$(…Éu…Ò„‹é#l$;é…ô‹l$$‹Ê#Í;Êtéã;J…Ú‹L$,ƒùuG‹H…É…Æ;Çt,;Ãu‹‹H…Ét‹‰Q ‹…Ét‹P‰Q‰G ‰xÇ‹øÇ@銃ùu9‹H…Ét~;Çtz;Ãu‹‹H…Ét‹‰Q ‹…Ét‹P‰Q‰G ‰xÇ‹øëLƒùu Ç@ë>ƒùu9;Øu‹ë‹H‹‰Q ;øu‹x‹3Ò;ʉPt‹h‰i‹H;Êt‹.‰i ‰‰P…À…³þÿÿ‹D$8‹L$<‰‰9_^][ƒÄËT$8‹D$<‰‰8_^][ƒÄɉ:_^][ƒÄËD$…Àt‹@ø$¦FÃSU‹l$V…íWt.‹|$…ÿt&W膚ýÿ‹ØƒÄ3ö…Û~VW脚ýÿ‹ƒÄ;ÍtF;ó|ë3À_^][áDJáôµI…ÀtdjRh,¦Fjj èg¤ýÿ¡ôµIƒÄ…Àt5VWèU¹‹ð¿PJó¥_ÇdJ`¢DÇœJ‰DÇôµI^j]h,¦Fjj è¤ýÿƒÄ¸PJÃ|$us¡ôµI…ÀtdjRh,¦Fjj èÝ£ýÿ¡ôµIƒÄ…Àt5VWèzT¹‹ð¿PJó¥_ÇdJ`¢DÇœJ‰DÇôµI^j]h,¦Fjj 茣ýÿƒÄ¸PJÃ3ÀáøµI…Àtjh”h<¦Fjj èd£ýÿ¡øµIƒÄ…Àt5VWèqT¹‹ð¿¸Jó¥_ÇÌJ ŠDÇJŠDÇøµI^hŸh<¦Fjj è£ýÿƒÄ¸¸JÃ|$uy¡øµI…Àtjh”h<¦Fjj èÝ¢ýÿ¡øµIƒÄ…Àt5VWèêS¹‹ð¿¸Jó¥_ÇÌJ ŠDÇJŠDÇøµI^hŸh<¦Fjj 艢ýÿƒÄ¸¸JÃ3Àøèö¶SUV3ÛWSÿÌF‰D$SSD$$3ÿjP‰\$$‰|$(èMqýÿƒÄè5NýÿSÿhF‹l$,‹…Ð;Ãu‹Ü‹”;Ãt‹ø‰|$‹EU@‰Eè½ÜÿÿƒÄöÄ0tUè¯ÜÿÿƒÄöÄ@t UèáÅÿÿƒÄ‹E4=S‰D$$_=PÃ=|=}"ƒè„y-ý„у腾éËU<‰]0=‹z‰|$ …‹…¼;Ãt ‹‹M;ÁtSUè»ÝÿÿƒÄ…À„1w _ÆVÆÆCUƒÃè&ÑÿÿƒÄPUè¬ÑÿÿƒÄ ð…À‰t$,„‹ÈˆCÁùˆ ‹•¼ƒÃ‹JD…ɉL$v?ƒù w:‹ÁˆKÁøˆ‹µ¼‹D$,‹ÑƒÆH‹øÁéó¥‹ÊƒÃƒáó¤‹|$ ‹ÊÁ‰D$,‹ðë ÆÆCƒÃ‹ETjÇ@dÆÆC‹MTƒÁhQè…pýÿ‹UT‹ÆƒÂh+÷ƒÆƒÄ‹ 3Û‰‹J‰H‹J‰H‹R ‰P ÇE4‰uDÇEHUèVd‹ðƒÄ;óŽi‰]DÇE4 éèˆàïÿÿƒù!‡W3ÒŠ‘„”Dÿ$•t”D‹M<= ‹y…â‹EDº +ÐÇRPUè×Y‹uD¹ +ÎƒÄ ;Á}6PjmUècƒÄ ‹ð;óŽî‹EhÇED÷ØÀƒàP03Û‰E4é^ÇED Š€ùG…®Š@„Òt¹ë3É‹UT‰Mh3ÉŠ@‰ŠÜ‹U3ÉŠ(ŠHƒÀ;Ê}‰M‹UT3ÉŠ(ŠHƒÀ‰Šà‹UT3ÉŠ(ŠHƒÀ‰Šä‹UT3ÉŠ(ŠH‰ŠØÇE4!‹ET‹ˆä‹àÊ‹Ø\ ûÿ?‡i‹ED‹ó+ðÇVPUèÑXƒÄ ;ÆtPjmUè!bƒÄ ‹ð3Ûéýþÿÿ‹E`…Àt‹Md‹UQUSWjRjÿЃÄ‹Ehw …Àt;‹ET‹ˆà…É…&‹ˆÜ…Ét ö…ø„,‹ˆä…É…;éi‹…¼‹HD…ÉvjUèÀÚÿÿƒÄ…À„3‹ETV‹ˆà‹ÜQRUèíƒÄ…ÀŽ‹ET‹à‹€äò…À„‹¼Á´QPVUèäÎÿÿ‹UT‹øƒÄ²ä…ÿ‰t$,„@hÐ\DWèŽýÿUèÉÍÿÿ‹ðhÐ\DVè|Žýÿ‹…øƒÄ©@t‹ßë‹Þ‹÷S3ÿèl“ýÿƒÄ…À~#WSèn“ýÿPVè§‘ýÿƒÄ…À}SGèI“ýÿƒÄ;ø|ÝSè<“ýÿƒÄ;øÝWSè:“ýÿ‹¼ƒÄ‰¬‹…¼‹ˆ”…É…Ì‹hh<¦Fj‹Jj‹‰”‹…¼‹ˆ”ƒÁQèžýÿ‹t$@ƒÄ‹…¼‹‹J‹”;…‹ET‹ˆØ‰ˆˆ‹ETƒ¸ˆ‡‡‹ˆØ¸Œ‹ÑÁéó¥‹Êƒáó¤éáüÿÿUè{‹ðƒÄ;ó޾‰]DÇE4€é=UèÙ‹ðƒÄ;󎜉]DÇE4`é=†tb ïÿÿƒø ‡~3ÉŠˆ¸”Dÿ$¨”DjUèûRƒÄ…À„‹‹UT‰ZÇE4@éÌUèˆ ëUèð ‹ðƒÄ;óŽ#é¬UèØ‹ðƒÄ;óŽ ‰]DÇE4péŠ=@t =P…ö;û‰]$t jjUÿ×ƒÄ ‹u<ÇE;óÇE‰t$uèK&þÿ‹ð;ó‰t$„èhÿ?Vè²&þÿƒÄ…À„É‹…܉u<‰]DÇE4‹H4‰\$A‰H4ÇE  ŠD‹|$;û„hùÿÿ‹u4‹D$$;ð„YùÿÿjhU‰E4ÿ×ƒÄ ‰u4éAùÿÿSUèØPƒÄƒÎÿé-hQh<¦FhµjejèFýÿƒÄéŠHÿ„Ét*SUèŸPhvh<¦FhÔjmjè×EýÿƒÄƒÎÿéÜhzh<¦FhÈjmjè´EýÿƒÄƒÎÿé¹h‘h<¦FhWjmjè‘EýÿƒÄé”h¡h<¦FhØjmjèqEýÿƒÄëwh©h<¦FhÙjmjèTEýÿƒÄëZh¯h<¦FhÚjmjè7EýÿƒÄë=jUèÚOƒÄë0jUèÍOƒÄë#jUèÀOhÕh<¦Fh¸jmjèøDýÿƒÄƒÎÿ3Û‹U‹D$J;ÉUt Pè»$þÿƒÄ‹D$;Ãt VhUÿÐƒÄ ‹Æ_^][ƒÄÃjUèbOhäh<¦FjAë£jUèLOh h<¦Fh¹ëŠjUè3Ohh<¦FjDéqÿÿÿjUèOh"h<¦FjDéXÿÿÿjUèOh*h<¦FhZé<ÿÿÿ‹E<;Ãt Pè$þÿƒÄ‰]ƒû0vjWèMh¢éNSQè¯fýÿƒÄ…ÀjWèàLƒÄƒÈÿ_^][ƒÄˆ¬ö@t<ÇD$;\$}BjWè°Lh¶h<¦Fh‹jfjèèAýÿƒÄƒÈÿ_^][ƒÄÃö@t ÇD$뼉\$‹L$‹|$+كƋˋӋÁˆ]ÁúÁéˆUƒÅó¥‹È3Àƒáó¤‹L$0‹|$ûÇD$ÿÿÿÿ‹QT‹r …ö‹t$•À@‰D$ ‹†…À„¾‹H‹…À„±Pè¢QýÿƒÄ‰D$…À„œƒ8th`h<¦FhÑë0‹T$ ‹@ R‹T$PL3WQRèä8þÿƒÄ‰D$…À}hgh<¦Fjh¼jèñ@ýÿƒÄ‹D$Pè¤jýÿ‹D$ƒÄ…ÀR‹L$0jQè}KhÄh<¦FhÐjfjèµ@ýÿƒÄƒÈÿ_^][ƒÄÃh[h<¦FhÀh¼jèŒ@ýÿƒÄ뮋L$0÷øtþG÷øtþD3‹ÐˆEÁúˆUø‹FƒÅ‹Ð‰|$ÁúƒøˆUˆEv+jQèåJhÓh<¦FjDjfjè @ýÿƒÄƒÈÿ_^][ƒÄËȃÆ‹ÑÁéó¥‹Ê‹T$ƒáó¤‹t$$‹L$0+Æ‹ùÂÇA41‰ADÇAHWèÆXƒÄ_^][ƒÄËD$Vx4@uk‹H<‹QÆ‹pT‹Žˆƒùv hìh<¦FjDhîjèƒ?ýÿƒÄƒÈÿ^ÃWz‹ÑÆŒÁéó¥‹Êƒáó¤‹HTÇ@4A_‹‘ˆÇ@HB‰PDPè1XƒÄ^ø 覨SUV‹t$0W½‹F<‹x‹F4=P…­‹FD¹"+ÈÇQPVèÁM‹NDº+ÑƒÄ ;Â}PjdVèWƒÄ _^][ƒÄ ÃÁ‹N`…ɉFDt‹VdRVP‹WjPjÿуÄ€t+jVèOIhh<¦FjfjdjèŠ>ýÿƒÄƒÈÿ_^][ƒÄ ˆ”…Àt‹ƒ8t‹H…Ét ÇF4Rë‰n4‹^D‹F4ƒë;Å…拆Ü3É3Ò‰L$‰T$‹@t3í…Àt0L$T$QRVÿЋèƒÄ …í}ÇF_^]ƒÈÿ[ƒÄ ËL$‹T$ƒýÇFuP…Ò„ÿ…É„QVÇF4Rè’4ƒÄ…Àt‹D$PVè6ƒÄ…Àu3í‹L$QèSýÿ‹T$RècgýÿƒÄ…íu;ÇF4Q‰|$4Æ‹D$4@‰D$4Æ‹D$4Æ@‹D$4ƒÀÇFH‰D$4ÇFD‹F4=Q„Y=R…NL$ ‰|$4Qèj½ýÿ‹–ÜjL$(‹‚€PQèq½ýÿ‹FT‹œ RPD$8P臾ýÿGSL$@PQèx¾ýÿ‹†¼T$\R‹ˆ‹Q‹PèœRýÿPL$TWQ‰D$LèL¾ýÿW‰|$p‰T$TÆ‹D$p@‰D$pÆ‹\$p‹Ž”C‰\$pD$T‹P‹PèTRýÿ‹L$x‰D$TÁ舋T$xŠD$T»ˆB‹T$x‹Ž”Ó‰T$xƒÄD‹L$‹B‹T$PQD$(RPè eÿÿL$0QèÁýÿ‹T$$‹D$HÁꈋL$HŠT$$ƒÄˆQ‹D$‹T$‹l$4Âë‰D$+ljl$4ÇF4S‰FDÇFHVèäTƒÄ_^][ƒÄ Ã…ÉtQèÏQýÿ‹T$ƒÄ…Òt RèŽeýÿƒÄhNh<¦Fjjjdjè¶;ýÿƒÄéþÿÿS‹\$UV‹C =`Ý =o=}{=„U ;ÄK;Æ…¿é@ =…¯‹UjjSRèÞuþÿƒÄ…À~(‹Ejjj PÇEèÁuþÿƒÄ…ÀŽ¥ÇE‹MX‹‘P‰U4é• ‰M0‹M<=‹Q‰T$H…’‹…¼…Àt‹‹U;Êu ‹ˆŒ…ÉtjUèÅÿÿƒÄ…À„E‹uXjÆ€ÿÌF‹Ð‹ÈÁêˆFÁ鈋ÐFjÁêˆFˆFVèÒXýÿ‹D$T‹MÁùXƒÄ ‰\$,ˆ ŠUC¹ˆ‹uX‹ECÆ€‹û‰…ƒÃ ó¥‹E(…Àt3Àë ‹¼‹ADˆC…Àt&ƒø ‡: ‹µ¼‹È‹ÑƒÆH‹ûÁéó¥‹ÊƒáØó¤CPUèL¸ÿÿƒÄPUèÒ¸ÿÿƒÄ …À„ ‹ÈˆCÁùˆ ‹•Üt‹‚…Àu3Ûë Pèß}ýÿƒÄ‹ØŠÃ3ÿþÀˆF…Û~ ‹ÜW‹‘RèÊ}ýÿŠƒÄˆFG;û|à‹D$,ÆF‹Î+È‹D$H‹ÑÁêÆˆP‹ÑˆHÁê+ðˆPÇE4‰uDÇEHjUè|h‹ðƒÄ…öŽÑ‹E‹M;ÁÇE4 ÇED„º QPèìtþÿƒÄ‰Eé¨ àîÿÿƒø1‡f3ÉŠˆŒµDÿ$xµDT$4Rh,jh!h Uèxm‹L$LƒÄ…ɉD$(u%…À‹ðŽQ‹Mh÷ÙÉá Á0‰M4é4 ‹E‹]@‹È3ÒŠ‰\$,Áù;Ñ…3 8C…* ‹}XƒÃƒÇ`¹‹óƒÃ ó¥3ÉŠ Cƒù ‰L$H‡Ï …ÉtC‹…¼;HDu8xH‹ó3Òó¦u-‹˜‹Ph;Ê…t pl½œ3Àó¦…a ÇEhëM‹¼ÇEh‹AD…ÀvjUè¶ÂÿÿƒÄ…À„e ‹•¼‹L$H‹ó‰JD‹½¼‹ÁƒÇHÁéó¥‹Èƒáó¤‹t$H‹MÞSÿQ8‹ðƒÄ…ö„; ‹UjjÿRD$hÑhÐUèÅ^‹ðƒÄ …öŽÊ‹Eh÷ØÀ%ÉE4é²=P…z‹D$‰M$;Át jjUÿÐƒÄ 3É‹Uâÿú…_‹E<‰u;Áu4èìþÿ‹ð…ö‰t$$„]h@VèSþÿƒÄ…À„G‰u<ÇD$$UèWfƒÄ…À„+jU蔵ÿÿƒÄ…À„Uè³V‹…ÜÇE4ƒÄÿ@4ÇED‹EX‹ˆT…ÉuT‹D$ …ÀuL‹…à…Àt‹Mjjj QèÛgþÿ‹ðƒÄ…öŽÀ‹L$…Ét‹u4‹D$@;ðtjhU‰E4ÿÑƒÄ ‰u43ɾ‰L$ »¿ ºéAñÿÿh1hL¦FjDhƒéXh<hL¦Fhµhƒé?h”hL¦Fhh’j¾/è &ýÿƒÄVjUè~yƒÄ é¾PVjUèhyƒÄ éÿh¯hL¦Fhøh’j¾/èÀ%ýÿƒÄVjUè4yƒÄ éËhºhL¦Fhh’j¾/èŒ%ýÿƒÄVjUèyƒÄ é—hÉhL¦FhÅh’j¾/èX%ýÿƒÄVjUèÌxƒÄ échÚhL¦Fhh’j¾/è$%ýÿƒÄVjUè˜xƒÄ é/hæhL¦Fjsh’éhˆhL¦FhYh’j¾/èÚ$ýÿƒÄVjUèNxƒÄ éåhvhL¦Fh h’jè«$ýÿƒÄ3ÒŠS¾FŠuVjU‰UèxƒÄ é¦hUhL¦FjDh‚é†hqhL¦Fhªé†hwhL¦Fh¥ëuhhL¦Fh©ëdh‡hL¦Fh£ëShŒhL¦Fh¤ëBh’hL¦Fh¢ë1h hL¦Fh§ë h¬hL¦Fh¦ëh³hL¦Fhúh‚jèË#ýÿƒÄj(jUè>wƒÄ éÕj2jUè,wh„hL¦FhŸh‘jè‘#ýÿƒÄ é¨Uè£Q‹E<3ÿƒÄ;Çt PèQþÿƒÄ‰}<‹EXöu Uè­²ÿÿƒÄjU‰}D‰}(è\®ÿÿ‹EhƒÄ;Çt ‹…Üÿ@X‹…ÜÇE `¢D¾‹H~‹D$H‹ËÁùˆXˆƒÃ‹VL$j0Q‹BT‹–¼ƒÂRVÿP ‹Ž¼T$$j0R‰Aè’¶ýÿƒÄé-h°hL¦FjDh˜jèýÿƒÄƒÈÿ_^][ƒÄ4è„W‹†¼‹ˆ‹y8…ÿ„%Wh°iEhÐiEèuôýÿ‹ØƒÄ …Û‰\$Huhrë-Sè» þÿƒÄ…Àuhwë‹WSRUè² þÿ‹øƒÄ …ÿ&h‚hL¦Fjh˜jèýÿƒÄƒÈÿ_^][ƒÄ4Ë–¼‹FWƒÂ‹HTURVÿQ ‹Ž¼‰A‹Ï‹Ñ3À‹ýÁéó«‹Êƒáóª‹CPèç«ýÿƒÀ‹|$\™ƒâƒÅÂU‹ØÁû‹Ëˆ]ÿÁùˆMþ‹WRè]²ýÿWƒÃè$þÿ‹|$0ƒÄ ÆG‹Ã‹ËÁøÁùˆ_ƒÃˆˆOÇF4‰^DÇFHjVè‹JƒÄ_^][ƒÄ4Ãj(jVè6hhkhL¦Fhîëj(jVèhh›hL¦FjDh˜jèƒýÿƒÄ _^]ƒÈÿ[ƒÄ4ø(èæ}SVW‹|$8ÇD$ 4…‹G<‹”‹p‹G‹‹HT‹GX‹ZT$ ,RPWÿQ‹ƒÄ ƒøuf‹OD$P‹QT‹OXÁQWÿR‹S D$RNPQT$(j$Rjrè“^þÿƒÄ$…ÀhÍhL¦Fj鵋D$ ÁèˆFŠL$ ˆN‹T$ BëSƒøt…†‹C L$8PVQ‹KRD$,jPQè«ÿÿƒÄ…ÀuhÝhL¦Fj ë`‹T$8ÁúˆVŠD$8ˆF‹L$8AÆF‹Ð‹ÈÁêÁéˆFƒÀˆˆNÇG4‘‰GDÇGHjWèìHƒÄ_^[ƒÄ(ÃhæhL¦FjDh™jè ýÿƒÄƒÈÿ_^[ƒÄ(øèf|UV‹t$3íW‰l$‹F4‰l$ =pu%‹†”;Åt‹9(t9ht ÇF4rëÇF4q~4q…ü‹†Ü3ÿ‹@t;Åt'L$ T$QRVÿЋøƒÄ ;ý}ÇF_^ƒÈÿ]ƒÄÃÿÇFuV9l$ t3‹D$;Åt+PVÇF4qèûƒÄ…Àt‹D$ PVèy ƒÄ…Àu!3ÿëhhL¦Fjjh—j3ÿèýÿƒÄ‹D$;Åt Pèã'ýÿƒÄ‹D$ ;Åt Pè¢;ýÿƒÄ;ýu7>u"‹NXj)jV‰©Xè@eƒÄ ¸_^]ƒÄËVXÇ‚XÇF4r~4ru1‹FXÇF4sƒ¸Xu3Àë ‹Ž”‹‹PVèŒIƒÄ‰FD‰nHjVèGƒÄ_^]ƒÄá¶I…ÀtdjZh\¦Fjj è'fýÿ¡¶IƒÄ…Àt5VWèf¹‹ð¿ˆJó¥_ÇœJ€ÇDÇÔJPÇDǶI^jeh\¦Fjj èÖeýÿƒÄ¸ˆJËD$ƒøué2Âÿÿ=uéæÙÿÿ=uéÁÿÿ3ÀøèzSUV3ÛWS‰\$ÿÌF‰D$SSD$$3ÿjP‰|$$èm4ýÿƒÄèUýÿSÿhF‹l$,‹…Ð;Ãu‹Ü‹”;Ãt‰D$‹ø‹EU@‰EèÝŸÿÿƒÄöÄ0tUèÏŸÿÿƒÄöÄ@t Uè‰ÿÿƒÄ‹E4=!‰D$,ò= =„ì=…éÜ=Œð=å‹U<‰]0=‹r‰t$ …T‹EXj €Pèv4ýÿƒÆƒÄ‰t$$Æ‹…ø~ F©uÆFÆFÇ…ë8©uÆFÆFÇ…ë©…=ÆFÆFÇ…WUè”ÿÿƒÄPUè‹”ÿÿƒÄ ;Äë‹ÈˆFÁùˆƒÆø¹ÆÆF‹øƒÆ€ã‰|$öÛÛ3ÀƒãðƒÃ ‹Óˆ^Áúˆ‹}XÇ€Só«‹EX+àPè“3ýÿ‹uX‹T$$‹Ë+ó‹ÁÆ ‹úÁéó¥‹È‹D$(+؃áó¤\þ‹ËˆXÁù€É€Sˆ‹D$0SPUÇE4‰UDÇEHèk>‹|$$ƒÄ3ÛUèle‹ðƒÄƒþ|$‹E`;Ãt‹MdVþQ‹MþÿƒÄ‹Å][á¶I…À}Ohh˜¦Fj j èVýÿƒÄ¡¶I…À}jjjh€¦Fjè¦6ýÿƒÄ£¶Ih•h˜¦Fj j èËUýÿƒÄ¡¶IÃhžh˜¦FjLè¿ýÿ‹ÐƒÄ …Òuh¡h˜¦FjAh¢jèžýÿƒÄ3ÀÃW¹3À‹úó«B ÇBH‰‹Â_ÃSVWh±h˜¦FjLè\ýÿ‹ØƒÄ …Ûu!h´h˜¦FjAhÝjè;ýÿƒÄ3À_^[ù3À‹ûó«‹|$‹+ǃè ÁøLà ‰ ‹W‰S‹G‰C‹O ‰K ‹G…ÀtPèt÷ýÿ‹WƒÄ‰S‹G‰C‹G…À„ÛPh°iEhÐiEèjÞýÿƒÄ ‰C…ÀuhÒh˜¦FjëK‹O‹A…ÀtPèb™ýÿƒÄ…ÀuhÚë&‹S‰B‹G‹@…À„Pè:™ýÿƒÄ…Àunhäh˜¦FjhÝjè[ÿüÿ‹CƒÄ…Àt Pè»õýÿƒÄ‹C…Àt Pè[úýÿƒÄs$¿‹Fü…Àt PèýÿƒÄ‹…Àt PèÔ(ýÿƒÄƒÆOuÛ_^3À[ËK‰A‹W3ö‰S‹D÷ …Àthó‰Dó h˜¦FjƒÀjPèÄTýÿƒÄ‹D÷$…ÀtHhú‰Dó$h˜¦Fj ƒÀjPèžTýÿƒÄƒþwÿ$µ´ÙDhh˜¦FhhÝjè„þüÿƒÄFƒþ|„_ÇCH‹Ã^[ËÿŸÙDŸÙDŸÙDŸÙDŸÙDS‹\$…Ûtxh=h˜¦Fj CHjÿPè TýÿƒÄ…ÀZ‹C…Àt PèŒôýÿƒÄ‹C…Àt Pè,ùýÿƒÄVWs$¿‹Fü…Àt PèâýÿƒÄ‹…Àt Pè£'ýÿƒÄƒÆOuÛSèTýÿƒÄ_^[ÃV‹t$…öuhmh˜¦FjCëiƒ>uwhžh˜¦FjLè“ýÿ‹ÐƒÄ …Òuh¡h˜¦FjAh¢jèrýüÿƒÄ3ÒëW¹3À‹úó«B ÇBH‰_…Ò‰uhth˜¦FjAhÞjè4ýüÿƒÄ3À^ø^Ãh€h˜¦Fj@èýÿ‹ÐƒÄ …Òuhƒh˜¦FjAhájèîüüÿƒÄ3ÀÃW¹3À‹úó«B ÇB<‰B‹Â_ÃW‹|$…ÿt|h•h˜¦FjGKýÿƒÄ VèUüÿÿƒÄ…À _^3À]ƒÄ ËL$ƒy vhTÊFjhh¸ÊFè KýÿƒÄ ‹|$ ‹–¼‹FTS‹ß÷ÛÛƒÂ#ÝR‹T$$Œ ‹D$QjRPè„c‹Ž¼‹VT÷ßÿƒÁ÷×#ýQ‹L$8„ ‹T$0PjQRè†c‹FTƒÄ(Œ ‰H\‹vT¸”3 [‰V`_^]ƒÄ ËD$…À‹D$t‹ˆˆ‹@T‹PHë ‹H|‹@T‹P@…Ét V‹1ƒ~u ƒÂÁêÁâ‹@XRPPQÿVƒÄ^øè†[‹D$SUV‹t$ W…À‹NTt‹Ô‹y`‹YL‹iTë‹Ð‹y\‹YD‹iP‹È‹ÐÁéÁêˆL$$ˆT$%‹ÈT$ÁéRˆL$*ˆD$+èÚqýÿ‹†€jL$PQèçqýÿ‹V|L$ ‹BXPWQèsýÿST$0URèùrýÿD$LjL$‹E…Àu7UÿU ƒÄ…ÀŒu&h­hÈÊFhåjjè ëüÿƒÄƒÈÿ_^][ƒÄ Ë…Ô…ÀtUèböÿÿ‹…ԃąÀt _^]ƒÈÿ[ƒÄ ÃjÿhF‹D$(ÇE…ÀŽ•‹MT‹YÇA+É\$‹ð‰t$‹}T‹D$$Ét$(‹O ‰D$…ÉtVPUèfƒÄ é"‹G…Àt ÇD$ ë ‹Œ‹Q‰T$ …ÀtþÿvÇD$(ÿ3ۉ酋E|‹T$ ‹‹Y 2ùÿ?v0‹G…Àu)ùÿv¹ÿ‹Á3Ò÷ó‹D$ Ç+Ê+È3Û‰L$(ë>ƒûw‹G…Àu Ç3Ûë(‹Á3Ò÷ó…Òu3Ûë+Ú‹G…ÀtÇë 3À…Û•À‰‹MT‹T$(‹t$ ‰QH‹ET‰X<‹ET‹H4ƒÁ‰HX‹ET‹H4L1‹t$‰HT‹ET‹Ê‹xT‹ÁÁéó¥‹Èƒá…Ûó¤t‹uT‹Ë3À‹~T‹ñúÁéó«‹Îƒáóª‹ET‹H…Éu1 j‰HL‹UT‹BXPUèº÷ÿÿ‹ET‹L$,Ùj‹pHUó‰pHèQ÷ÿÿƒÄ‹ET‹PH‰P ‹MTƒ9‹AXt:‹IHƒèÁé€á?ˆ‹UT‹r…öt€É@ˆ‹MTŠQHˆP‹MTŠQ<ˆP‹MT‹Q ƒÂë ‹IHƒèÁé€É€ˆ‹UTŠJHˆH‹MT‹Q ƒÂ‰Q ‹UT‹t$(‰B8‹ET‹˜ÔC‰˜Ô‹MT‹D$‰A‹UT‹L$P‰J‹UTQU‰r$‹UTÇBèG‹\$$‹t$ƒÄ …À~;Æt(ö…üu+ð؉t$‰\$é”ýÿÿ‹MT_^]‰Y[ƒÄ ÃÃ_^][ƒÄ ÃU‹T$V‹t$ W‹FT‹H;Ê£‹P‹D$;Ðt ö†ü„‹‹=hFjÿ׋N…Ét"‹FTÇF‹P ‹hR‹P8ÕRQèñ&þÿƒÄ ë!hðhÈÊFhhÔjè1èüÿƒÄƒÈÿ‹NT;A t…À~I‹iè‰i‹NT)A ë–‹FT_Ç@ ‹NTÇF^‹A$]ÃhàhÈÊFjhÔjèÜçüÿƒÄƒÈÿ_^]ËD$ …ÀŒ”V‹t$W‹NDÈ‹Á‰NDƒø|{‹F<‹x€?up3ÉŠoŠOAÿƒøw#ÿ$…ôðD¸Ëë¸Êë¸Éë ¸Ìë¸ý‹T$h¤hÈÊFPRjèUçüÿ‹NDƒÄƒÁý‰ND‹ñ…ö~GVPWÿ8FƒÄ _3À^ÃI“ðDšðD¯ðD¡ðD¯ðD¨ðDV‹t$‹N<‹FDP‹Q‹NHÑRVèûÿÿ‹NDƒÄ ;Áu,‹F`…Àt‹VdR‹VHÑ‹N÷Dg÷DÉ÷D»÷DPøD™÷D™÷D™÷D™÷D™÷D™÷DaøD‹D$‹ˆ¨‹D$ƒètHt3ÀËT$ ¸‰QËD$ ‰A¸ø,è†HD$‰D$¡$ÌI…Àtoh°hlÎFjj èÒ3ýÿ¡$ÌIƒÄ…Àt:¹ J¸ÄI‰ƒÀ(ƒÁ=ˆËIrñhÐ\Djj0h JÿLFƒÄÇ$ÌIh¾hlÎFjj èy3ýÿƒÄ‹D$03É3ÒhÐ\DŠŠPÉjÁáj0D$ Êh JP‰L$ èòXýÿƒÄ…Àt‹ƒ8u3ÀƒÄ,ËL$…Ét$‹D$‹@‹Ðâÿút3ÀËЈAÁúˆ¸ÃV‹t$‹F,…Àuh~4@t_‹F0¨uj jV‰F0èE1ƒÄ ë-‹NX‹‘H…Òt Vè½1ƒÄë¨ujjjjVèf"ƒÄƒ~0u ‹VX‹‚H…Àt 3À^ÃÇF0¸^ÃVjÿhF‹t$‹FX‹ˆP…ÉtO‹ˆ´…ÉuE‹ˆÄ…Éu;VèÜlÿÿƒÄöÄ0u-‹FXÇF40Ç€P‹FX‹XB‰X‹FXÿ€T‹FXötv‹N‹V;Êul‹H…Éu‹T$‹D$ RPjVè܃ąÀ~a‹NX‰A‹Vjjj RÇFèÙþÿƒÄ…À~>VÇFèåkÿÿ‹FXƒÄ‹ƒáû‰‹vX‹FÇF^ËD$‹L$ PQjVèwƒÄ^ÃSVWjÿhF‹t$‹FX‹ˆP…ÉtO‹ˆ´…ÉuE‹ˆÄ…Éu;VèÚkÿÿƒÄöÄ0u-‹FXÇF40Ç€P‹FX‹XB‰X‹FXÿ€T‹|$‹\$‹NXjWSjVÇ\è¤ ƒÄƒøÿu-‹VXƒº\u!‹FjWS@jV‰Fè} ‹NƒÄI‰N_^[ËNX_^[Ç\ÃSVWjÿhF‹t$‹FX‹ˆP…ÉtO‹ˆ´…ÉuE‹ˆÄ…Éu;VèújÿÿƒÄöÄ0u-‹FXÇF40Ç€P‹FX‹XB‰X‹FXÿ€T‹|$‹\$‹NXjWSjVÇ\èăăøÿu-‹VXƒº\u!‹FjWS@jV‰Fè‹NƒÄI‰N_^[ËNX_^[Ç\ËD$‹H …Ét‹@Xöt3ÀÃÇ€P¸ÃV‹t$W3ÿ‹FX9¸PtV9¸´uN9¸ÄuFVè÷iÿÿƒÄöÄ0u8‹FXÇF40‰¸P‹FX_‹ˆXA‰ˆX‹vX‹†T@‰†T¸^ËÇ_^ødèvCS‹\$lUV‹CXW3ö‹ˆH‹x‹¨|‹€€‹y‰t$ƒç;Ɖ|$0‰T$u‰t$xë‹@‰D$xöD$|„ä9s|t ÇD$ë"hÚh„ÎFhŒè€ëüÿƒÄ ;ƉC|„<‹ƒ„‹s|…À‰t$‰«€tPèÅEƒÄǃ„‹D$x…ÀtePèZEƒÄ‰ƒ„…Àuhéh„ÎFhŽé-‹KX‹Ü…Àu hîh„ÎFh@èøêüÿ‹SXƒÄ ‰‚Ü‹CX‹ˆÜ…É„¥‹SX3Ƀ‰ ‰J‹CXƒÀ‰D$$éµ9³ˆt`ÇD$‹ƒˆ‰«Œ‰D$‹ƒ;ÆtPèÿDƒÄ‰³‹D$x;ÆtYPè˜DƒÄ;ƉƒuFhh„ÎFhŽékhùh„ÎFhŒèCêüÿƒÄ ;Ɖƒˆu‡hUh„ÎFjAé9‹SX3ɃÂ4‹t$‰ ‰J‹CXƒÀ<‰D$$‹D$…Àt VèÜMƒÄVè3E‹D$‹SX‹uƒÄ‹h‹Št…ÿ‰l$xtV‹ªH‹}ƒçt¸ë‹E %ð‡-÷ØÀƒÀ9D$x}‹l$xë!…ÿt½ë‹m åð‡í÷ÝíƒÅ‹D$‹@ ‰D$x‹D$|ƒøt:ƒø!t5‰D$ Du<‰|$‹|$xýÇȉL$‹L$xÁJ`‰L$(Š€ë+6‰L$ <hȉ|$‰L$‹L$xHŠ€‰L$(J`‰L$,‹Šp;Á~%h0h„ÎFjDhjèàÖüÿƒÄ3À_^][ƒÄdÃT$4RèùVýÿ‹|$(‹Î‹t$$‹ÁÁéó¥‹È‹D$4ƒÄƒá…À󤄴jè+\ýÿL$8PQèàVýÿ‹T$UD$DRPèXýÿ‹t$@j L$PVQèïWýÿ‹|$Pj T$\WRèÞWýÿ„$„jL$hPQèêWýÿ‹„$´ƒÄ<…Àl$T~NjèÁ[ýÿT$8PRèvVýÿj D$DVPè™Wýÿj L$PWQèŒWýÿT$hjD$\RPè›WýÿL$tƒÄ0‰L$ë‹l$‹D$|‹“¼‹L$ƒàP‹D$PÇB‹T$$UjQRèCD$lj PèvýÿL$djQèvýÿT$\Rè\ZýÿƒÄ,¸_^][ƒÄdødèö>SU‹l$pV3öW‹EX9°pt _^]¸[ƒÄdÃL$(T$Q‹¼D$RPQèiyÿÿƒÄ…Àuhhh„ÎFhŠé¡‹UX‹D$‰‚x‹MX‹T$‰‘|‹EX‹L$(‰ˆ€‹D$‹T$‹X ‹H‹BÙØ‹EXÑ㋈t;Ît(‹€pPQè&uýÿ‹MX‹‘tRè7éüÿ‹EXƒÄ ‰°t‹MXhuh„ÎFS‰±pè’æüÿ‹øƒÄ ;þu%h“h„ÎFjAhjèqÔüÿƒÄ3À_^][ƒÄdËUXL$@QÆD$|A‰šp‹EX‰¸tèsTýÿT$4RèiTýÿƒÄÇD$$…ÛŽ~¸‰|$+lj\$‰D$,Fƒþ‰t$ ‡÷…ö~&ŠD$x‹ÎŠÐ|$PŠò‹ÂÁàf‹ÂÁéó«‹Îƒáóª‹|$ŠD$xjþÀˆD$|è*»ýÿPD$8PèTýÿL$\VT$@QRè/Uýÿ‹…¼T$H‹HƒÀQPRèUýÿ‹EXj ƒÀ`L$XPQèUýÿ‹UXj €D$dRPèîTýÿŒ$œjT$pQRèúTýÿƒÄHjèàXýÿPD$HPè•Sýÿ‹…¼T$L‹HƒÀQPRè­TýÿD$xjL$\PQèœTýÿ‹T$PƒÄ$×;Ój~2D$dL$DPQèžTýÿ‹L$t$l‹ÑƒÄ Áéó¥‹Êƒáó¤‹t$ ‹|$ëD$DWPèpTýÿƒÄ ‹D$$‹L$ƒÀƒéƒÇ;ÉD$$‰L$‰|$Œ•þÿÿL$`jQèürýÿT$HRèRWýÿD$RSUPQèƒÄ(Æ_^][ø<è¶8VD$ WPèZOýÿ‹L$PT$QRè;Qýÿ‹D$ƒÄ ‹H¸0™÷ù‹ð‹D$P¯ñ…Àt‹L$TT$QPRèlPýÿƒÄ ‹|$HT$‹‡¼‹HƒÀQPRèMPýÿVD$ h(ÌIPè=PýÿL$ T$8QD$,RPèIPýÿ‹L$4jT$8QRèèNýÿ‹‡¼T$@‹HƒÀQPRèPýÿVD$PhXÌIPèðOýÿ‹L$PƒÄHT$ D$QRPèÙOýÿ‹T$dL$QD$ RPèåOýÿL$(QèûRýÿ‹D$(ƒÄ_^ƒÄ<øè–7‹D$$‹L$SUVW…À‹AXt‹©Œ°àP<ƒÀ4‰T$‰D$ë‹©€°ÈPƒÀ‰T$‰D$‹M¸03Ò‰L$4÷ñ‹ØD$P¯ÙèÞMýÿjL$ UQèñMýÿ‹T$D‹D$ RL$,PQè OýÿST$8h(ÌIRèýNýÿ‹D$‹F…Àu7VÿV ƒÄ…ÀŒu&hh¤ÎFhåhžjè¿üÿƒÄƒÈÿ_^][Ël$ ‹\$+ïý@¸@w‹ÅjP‹D$$ QSVèGƒÄ…À~;Åt"ƒûu ö†üu+èøëÀ‹VX‰º_^][ËNXÇǤ_^][øè†(S‹\$U3í‹CXVW‰l$9¨Ät ‹D$0‹L$,‹T$(PQRS舃Ä_^][ƒÄÃ9¨HtSèσÄ;ÅŽO‹|$0;ýu9l$4u _^]3À[ƒÄËSX‚¸²à‰D$‹ƒ¼;ʼnt$$t9«ˆt ‹ƒŒ;Åu ‰l$醋H‹D$4;ʼnL$uw9ª¤uo9ª t]ƒ|$(uV‹T$,jURjSèÿÿÿƒÄ;ʼnD$ŽÑ‹SXH9‚¼s#hqh¤ÎFjDjhjèö½üÿƒÄƒÈÿ_^][ƒÄË|$0Ç‚¤‹D$‹T$‹(‹D$(êˆE‰‹ EÁùˆMŠEˆU‹T$,E‰~‰l$ƒÅ‰n ‰V‹ƒ…ÀtX‹{XÇà‹O‹WQ‹O RhDQPè*ƒÄ…À| ‹W ‰G‰WëFh”h¤ÎFhjhjèM½üÿƒÄ_^]ƒÈÿ[ƒÄËϋò‹Á‹ýÁéó¥‹È‹D$$ƒáó¤‹H ‹ð‰H‹|$…ÿt#‹N‹SÍj‹BTQSÿP‹FƒÄ ljn‰F‰n ‹SjS‹BTÿ‹N‹D$$Á鈊V‹L$0ˆP‹V‹D$<ƒÂƒÄ‰‰V…À‹òt ‹Æ_^][ƒÄËD$ð‹D$‰p Ç@‹SX‹D$0P‰‚ ‹sX‹T$0‰–‹sXRQ‰Ž‹sXS‰†èƒÄ_^][ƒÄÃU‹T$V‹t$ W‹FX‹ˆ ;ÊÓ‹‹L$;Ñt ö†ü„¸‹€‹L$;Á…¦‹=hFjÿ׋N…Ét+‹FXÇF‹Ä‹¨¸R‹ÀÕRQèpúýÿƒÄ ë!hêh¤ÎFh€hŸjè°»üÿƒÄƒÈÿ‹NX;Ät…À~X‹©À艩À‹NX)Äë‹FX_ǀċNXÇF^‹]ÃhÚh¤ÎFjhŸjèI»üÿƒÄƒÈÿ_^]øHè¦$SU‹l$TVWÇD$‹EX‹ˆ¨…ÉuUèCúÿÿƒÄ…À„Ù ‹|$`…ÿt ƒÿtƒÿu ‹D$l…Àt+ƒÿt&h#h¤ÎFjDh”jèÁºüÿƒÄƒÈÿ_^][ƒÄHÃÿuy‹MX‹…Àvl‹t$hÁ3ÿ…ö~-‹D$d‹UX‹š…ÛvŠAˆ‹UXN‹šKG…ö‰š׋UX3ö‹‚…ÀvŠAˆ„2‹UXF;²rê‹Ç_^][ƒÄHËE…Àu)UèØIÿÿƒÄöÄ0tUÿU ƒÄ…ÀŒõ u hEé ‹EXÇE‹ˆÌ˜È…Ét }8ñ…„‹µø‹¬æÿ3Éƒæ ‰L$‰L$‰L$‹¼êHÁæ ;ò‰L$ ‰t$\…të‹t$\}8ñu ƒ}Pƒ›‹EXj‹ˆ¬QjUè_ ƒÄ…ÀŽH ‹uL3ÒÇE8ñ3ÀŠF‰3ÉŠŠNF3ÒFŠð3À‹ùŠF úŠ&‰C‹……Àt Ç…ë‹E¿Ï;È…çÿÿÿfÿ…-‹T$\‹CÂH;‡A‹t$\‹MP‹Cƒé;ÁvjPPUèÁ ƒÄ…ÀŽª ‹ELÇE8ð‹KÆHƒÀ;ΉC‡‰C ‹UjU‹BTÿƒÄ…À„k ÇD$‹D$ …Àt‹E|…Àt ‹…€…Àu ÇD$ë|‹L$…Éut‹x‹L$\‹C”D;ÂvÇD$;Çr‹s +Çð‰C‰t$ë‹t$ÇD$ÇC‹ET$4jR‹HTUÿQƒÄ …ö„x‹Ï‹|$t$43Àó¦…d‹D$…À…X‹…„3ÿ;ÇtI‹L$\‹SÁD;чM‹uXÆÈ‹V‹N R‹VQh@RPè†$ƒÄ;ÇŒ8‰F‹F‰F ‹L$\‹CÁ@;Á‡-‰{‰}P9{„Äýÿÿ‹|$`‹EX‹ˆ<…Ét ƒ;…³öE0…Ò‹ ;ù„àƒùuº°‰T$ëƒùumº°ø‰T$ü‹8‹Ê+Ï‹{;ùs‹Ï‹ùI…ÿv5A‰L$\‹S ‹K‹8Š ˆ7‹A‰‹{‹S‹L$\GJI‰{‰S‰L$\uÔ‹T$‹‹|$`;Ê‚žüÿÿ‹M$…É… ‹EXƒ¸‚ùŠ„Ò…ë‹•¼…Ò„Ý‹²¬…ö„ωˆ‹EXŠˆ„É…ÁŠˆ„É…³Šˆ„É…¥‹M`…Ét‹UdRUjP‹EjPjÿуÄUè´EÿÿƒÄƒø…óûÿÿ‹EXö…çûÿÿ‹ˆP…É…ÙûÿÿUè8ÛÿÿUèbÛÿÿƒÄ…À„ÂûÿÿUÿU ƒÄ…ÀŒœ„ûö…ü… ûÿÿ‹MX‹´…À„çéŠûÿÿ‹EX¾9°ü‚›3Û3ÒŠ˜øŠùÇ€ü‹E`…À‹òt‹Md‹UXQ‹MUÂøjRjQjÿЃÄ‹…Ð…Àu‹•Ü‹‚”…Àt‰D$‹D$…Àt‹ÃÁà ÆPh@UÿT$ ƒÄ ƒû…¨‹MX…ö‰±@„…éÛúÿÿöE0…‹ƒú…ÿƒ{… ‹C…À…‹K €9… ÇC‹E`…Àt‹UdRUjQ‹MjQjÿЃÄ‹UXÇ‚<‹u4‹EXæ ÷Þ‹ˆtöƒæƒÆ…Éu'‹¼‹HU‰‘¬‹E‹HTÿQƒÄ…À„‹UVU‹BTÿPƒÄ…À„þ‹E4öÄt‹M‹AT‹P(‹p,ë ‹U‹BT‹P ‹p$‹MX™ôSVR‘,ÁRQUÿP‹MXƒÄ‰<éÇùÿÿƒ¸rkƒ}ue‹U4âÿƒúuöu÷ÙÉÇE(áÁ‰M4UÿU ƒÄ…ÀŒe„ö…ü…iùÿÿ‹EX‹ˆ´…É„ éSùÿÿƒú|ƒúŽ|ƒú„}…yÇCé#ùÿÿhÿh¤ÎFjDhjè³üÿƒÄƒÈÿ_^][ƒÄHÃhh¤ÎFh hjèç²üÿ¿ÏƒÄ‰M¾Fé·h)h¤ÎFh hjè¹²üÿƒÄƒÈÿ_^][ƒÄHÃh0h¤ÎF¾hÆëihXh¤ÎF¾h–ëSh¨h¤ÎF¾hUë=h²h¤ÎF¾hŒë'h¸h¤ÎF¾jkëhÀh¤ÎF¾h’hjè ²üÿƒÄ‹UV‹BTÿP0‹Ø‹EƒÄ=u ƒûFu»(ë…یы…¼…Àt‹ÜPQèÉMÿÿƒÄ‹UXÇ‚H‹EXÆ€L‹MXˆ™M‹UX‹‚Ä…À…†U诃ăÈÿ_^][ƒÄHÃh`h¤ÎFh‘h”jèv±üÿƒÄƒÈÿ_^][ƒÄHÃÇC_ÇE^]3À[ƒÄHÃUèú@ÿÿƒÄöÄ0t"ƒÿu‹E|…Àuhvh¤ÎF¾ jdéy‹D$h…ÀŽø‹K;Áv‹Á‹s ‹{‹È÷‹|$d‹ÑÁéó¥‹Êƒáó¤‹L$l…É…Ç‹{‹s+øð‹Ï‰{…ɉs…­ÇE8ð‰{_^][ƒÄHÃhÝé7UÇEèÀ/ÿÿ‹HƒÄƒáùƒÉ _^‰H]ƒÈÿ[ƒÄHÃhËh¤ÎFjih”jèn°üÿƒÄƒÈÿ_^][ƒÄHËE0_ ^‰E0]3À[ƒÄHÃûuw‹UXh†èh¤ÎFPh”ÇEj‰²Dè°üÿVh˜ÊHL$@jQèŠ ýÿT$HRh´ÎFSèJ¸üÿ‹}0‹…¼‹Ü ûPQ‰}0èÏKÿÿƒÄ83À_^][ƒÄHÃh&h¤ÎF¾/höé_ÇE^ÇC]3À[ƒÄHÃh<h¤ÎFjgh”j良üÿƒÄƒÈÿ_^][ƒÄHÃhah¤ÎFhåh”jè`¯üÿƒÄƒÈÿ_^][ƒÄHÃUÇEèe.ÿÿ‹PƒÄƒâùƒÊ _^‰P]ƒÈÿ[ƒÄHËMX‹\…ÀtD‹T…Àt:‹E4öÄt=|= ~öÄ t= !=!|‰±\_^]ƒÈÿ[ƒÄHþ hªëhh¤ÎF¾ jDë¾ h„h¤ÎFhõh”jè›®üÿ‹EƒÄ‹HTVÿQ0‹Ø‹EƒÄ=u ƒûFu»(ë…Û|P‹…¼…Àt‹•ÜPRèHJÿÿƒÄ‹EXÇ€H‹MXÆL‹UXˆšM‹EX‹ˆÄ…Éu Uè2ƒÄƒÈÿ_^][ƒÄHËD$S3ÉUV‹t$;ÁWu(‹FX9ˆ´u‰ˆ°‹FX‹°‹¸¨׉NP‰VL‹FX‹\$‹¸´;û|.‹VP_Ó‰VP‹ˆ´+ˉˆ´‹vX‹†°Ɇ°^‹Ã][Ã9N\u‰\$‹nP‹ˆ¬‹T$+Í;Ñ~‰L$;\$~#h«h¤ÎFjDh•jèY­üÿƒÄƒÈÿ_^][ËNL‹€¨;Èt/RQPÿ8F‹FXƒÄ ‹ˆ¨‰NL;û}ojÿhF‹F …Àt1‹T$‹NX+×ÇFR‹‘¨×ÕRPèñêýÿƒÄ …À~)ø;û}1ëÀhÈh¤ÎFhÓh•jèǬüÿƒÄƒÈÿ‹NX‰¹´_^][ËVXë+û‰ª°‹FX‰¸´‹FPÃÇF‰FP_^‹Ã][ËT$ SV‹t$ R‹F‹HTÿQ0‹Ø‹ƒÄ=u ƒûFu»(ë…Û|Zƒ|$u‹†¼…ÀtP‹†ÜPè HÿÿƒÄ‹NXŠD$ÇH‹VXˆ‚L‹NXˆ™M‹VX‹‚Ä…Àu VèƒÄ^[ÃV‹t$Wj‹FXjÇ€H‹NXÁLQjVè·ìÿÿ‹øƒÄ…ÿ‹VX_^Ç‚HËFX€¸Lu‹Njjj QèÃìýÿƒÄ‹F`…Àt‹Vd‹NXR‹VÁLjQjRjÿЃÄ‹ŽÐ…Éu‹†Ü‹ˆ”…Ét‹FX3ÒŠ°LŠMRh@VÿÑƒÄ ‹Ç_^ø,ø ÌIÃVèŠÄÿÿ‹ðè#±ÿÿÆ^ÃèkÄÿÿ‹L$;Ès QèmÄÿÿƒÄÃ+ÈQè±ÿÿƒÄÃVè:Äÿÿ‹t$Vè ËÿÿƒÄ…Àu Vè³²ÿÿƒÄ^ËL$…Ét‹D$‹@‹ÐˆAÁúˆ‹ÐÁúˆQ¸ÃVjÿhF‹t$Vèý9ÿÿƒÄöÄ0tI‹F…ÀuBVÿV ƒÄ…À|Cu h´hÏFhåjxjèªüÿƒÄƒÈÿ^ËD$‹L$ PQVèa+ÿÿƒÄ ^ÃVèæ7ÿÿƒÄƒÈÿ^ÃVjÿhF‹t$Vè}9ÿÿƒÄöÄ0tL‹F…ÀuEVÿV ƒÄ…À|Fu#hËhÏFhåhíjè–©üÿƒÄƒÈÿ^ËD$‹L$ PQVè>+ÿÿƒÄ ^ÃVèc7ÿÿƒÄƒÈÿ^ÃVjÿhF‹t$Vèý8ÿÿƒÄöÄ0tI‹F…ÀuBVÿV ƒÄ…À|Cu hâhÏFhåjyjè©üÿƒÄƒÈÿ^ËD$‹L$ PQVè+ÿÿƒÄ ^ÃVèæ6ÿÿƒÄƒÈÿ^ÃSUV‹t$W‹F<‹^H‹~D‹V‹hWÇF +QRèWçýÿƒÄ …À~+;ÇÇFt+‹NØ+øÇF+WPQè,çýÿƒÄ …ÀÕ‰~D‰^H_^][Ã_^Ã][ÃSV‹t$ W‹|$‹FP;ÇsZ‹^L‹V ‹ÏÇF+ÈÃQPRèCæýÿƒÄ …À~:‹VPÇFЋ‰VP;Çs%‹V ‹Ï+ÈÃQPRÇFèæýÿƒÄ …ÀÌ_^[ËÇ_^[øøèfS‹œ$UV‹CXW3ö‹ˆH‹x‹¨|‹¸€‹IŠ„$ƒá‰t$¨‰L$‰T$$„ß9s|t ÇD$ë"hhLÏFhŒèz¹üÿƒÄ ;ƉC|„ ‹ƒ„‹s|…À‰t$ ‰«€tP迃Äǃ„…ÿtd‹GPèUƒÄ‰ƒ„…ÀuhhLÏFhŽéJ‹KX‹Ü…Àu hhLÏFhHèó¸üÿ‹SXƒÄ ‰‚Ü‹CX‹ˆÜ…Étx‹SX3Ƀ‰ ‰J‹CXƒÀ‰D$éß9³ˆt ÇD$ë!h&hLÏFhŒè˜¸üÿƒÄ ;Ɖƒˆt)9³ˆu2h*hLÏFhŒèo¸üÿƒÄ ;Ɖƒˆuh«hLÏFjA釋ƒˆ‰«Œ‰D$ ‹ƒ;ÆtP衃ĉ³;þt*‹OQè;ƒÄ;Ɖƒuh8hLÏFhŽé0‹CX3ÒƒÀ4‹t$ ‰‰P‹CXƒÀ<‰D$‹D$…Àt V豃ÄVè‹|$(‹KX‹u‹T$‹o‹tƒÄ‰l$…ÒtX‹‰H‹iƒåtºë‹Q âð‡ê÷ÚÒƒÂ9T$}‹l$ë!…ít½ë‹i åð‡í÷ÝíƒÅ‹”$‹O ƒú‰L$,t3ƒú!t.ÇD$(‰T$0Tu<‰|$<)×ÂщD$¸8ÏFë'6‰D$0ÇD$(<j‰|$‰D$J¸$ÏF‹KX;‘p~(hdhLÏFjDhÑj辤üÿƒÄ3À_^][ÄøÃ‹|$‹Î‹t$0‹ÑÁéó¥‹Êƒáó¤‹L$…É„³‹‹P‰L$T‹H‰T$X‹P ‹CX‰L$\¹|$d°€‰T$`ó¥p`‹D$$¹¼$„󥋋܋x‹ÅW‹‘ˆƒå‰T$ ™+‹ð‹D$Ñþõ‰T$”$¬RºPRT$`RVP‹„P訌$W¸PQ‹L$@T$xP‹D$ñ‹L$‰D$ ¸MQP‹…ÜRV‹€„WPèOüÿÿ‹|$4‹T$8S¸MWL$LP‹D$HQVRPè.üÿÿƒÄ8…Û~‹D$‹÷+ð‹ËŠ0@Iu÷SWè½>ýÿWèײüÿ‹…øƒÄ öÄu_‹EXÇ€ ‹¼‹¬3É;Át@‹P âð‡úu ‹EX‰ˆ ‹•¼‹‚¬‹P âð‡ú@u ‹EX‰ˆ _^]¸[ƒÄløèF‹L$ ‹D$SUVW…Ét‹hX‹°ˆ‰l$Åà…öu3Àë‹p|‹@X…ö‰D$¨Èu3Àë‹‹T$‹º¼…ÿ„i…ö„a…À„Y‹‹]‹xƒÿtP…ÉtP‹Ã™÷ÿ‹Ç+‹T$ö‚ùHÿt ‹T$ötA;Ú‰T$}‹UCˆLÿ‹T$;Ú|ð‹M‹ÚȉM‹L$…ÉuB…Ût ‹Ã3Ò÷÷…Òt4hVhLÏFhhÒjèÕœüÿ‹D$,jjPèGðÿÿƒÄ 3À_^][YËU‹E ‹SRPVÿQƒÄƒÿ„¶‹D$…À…ª‹M 3ÀŠDÿ‹L$‰D$@‹‘øöÆt5‹QX¹‰T$¿lÏFr3Òó§uöD$u‹L$ƒ ‹L$‹QXötH‹};Ç~ _^]ƒÈÿ[YËó+ð;ó}‹M 3ÒŠ1‹L$;ÑußF;ó|ë+ø¸‰}_^][YËE‹M‹U PQRÿ8F‹E ƒÄ ‰E_^]¸[YøèVD$Pèüýÿ‹L$ T$QRèÝýÿ‹L$,D$ PT$QRèIýÿD$Pè_ ýÿ‹D$ƒÄ0øTè‹D$hS‹ÈUV‹t$p‹ÑW|$,Áéó¥‹Êƒáó¤t,D$Pèˆýÿ‹L$pT$ QRèiýÿ„$„L$(PVQèÖýÿ‹”$ˆ‹Œ$D$4RPñè;ýÿŒ$˜T$…khu9‹L$ ‹T$‹UQRSÿPƒÄ…Àt‹D$_^‰(]¸[ËL$_^]Ç3À[Ë‹rƒþ ‰t$vh€ÐFhhhÐFèbæüÿƒÄ …ÿ„/;Æ}4‹t$ ‹Í‹Ñ|0Áéó¥‹Êƒáó¤‹C _Å^‰C ‹D$][ǸËî‹t$ +ï|0‹Í‹ÑÁéó¥‹Êƒáó¤‹t$‹|$‹K0VQWSÿPƒÄ…Àu_^][ËT$$‹L$ +Õ͉T$$‹T$‹l$$þ‰2‹t$‰L$ ë‹D$‹|$ÇN#õ+î‰t$$…í~‹T$ ‹ URWSÿQƒÄ…Àu_^][ËD$(…öt‹D$ ‹Î‹Ñ{04(Áéó¥‹Êƒáó¤‹t$$‰s _^]¸[ÃUV‹t$ ‹‹hƒý vh ÐFhFhhÐFè,åüÿƒÄ ƒýu‹L$‹Å^]ÇËF\‹N öÄt6…Ét hQhhÐFhŠjjèÞŒüÿƒÄ3À^]ËT$^¸]ÇËÅ+Á;Í}$SŠØW|10Šû‹È‹Ã‹ÑÁàf‹ÃÁéó«‹Êƒáóª_[‹T$‹N0UQRVÿPƒÄ…Àt‹L$‰)^]ÃSUV‹t$ …öWu‹D$_‰0^]¸[Ë\$‹C\öÄt‹L$ ‹T$‹D$VQRPSèRýÿÿƒÄ_^][Ë ‹iƒý vh¸ÐFhshhÐFèäüÿƒÄ ‹Cd…Àt-‹D$‹Í‹Ñsl‹øÇD$Áéó¥‹ÊƒáÅó¤‹t$$‰D$ëÇD$‹D$ ‹L$V‹t$ PVQSè×üÿÿƒÄ…Àu_^][Ãý~5‹C …Àu.‹‹D$+Í{l‰‹ÍÇCd‹6‹ÑðÁéó¥‹Êƒáó¤‹t$ëÇCd‹D$…Àt._^]¸[ÃS‹\$UV‹t$ÇW‹‹x‹F\öÄt-‹F …À„íh¥hhÐFhŠjejè‹üÿƒÄ3À_^][ÃÿŽÂ‹F …À…˜‹Fd…À„ƒÿ vh¸ÐFh²hhÐFèÜâüÿƒÄ 3ÀŠD7k;Ç~h¶ëF3í…À~L7lI3ÒŠ;Ðu.E;è|ò‹‹I+È3À…É~‹|$ŠTlˆ8@;Á|ô_^‰ ]¸[Ãh½hhÐFjdjejèbŠüÿƒÄ3À_^][Ãh¯hhÐFjmjejèCŠüÿƒÄ3À_^][Ã_^Ç]¸[ÃW‹|$‹…Àt)‹@…Àt WÿЃÄ…Àu_ËG`…Àt‹‹Q RPèO*ýÿƒÄ‹G`…Àt Pè_žüÿƒÄ‹G…Àt PèŸrýÿƒÄ¹#3Àó«¸_ËL$‹‹Pö€ty…ÀuhúhhÐFhƒj|j膉üÿƒÄ3ÀË@,…ÀuhÿhhÐFh„j|jèa‰üÿƒÄ3ÀËT$jRjQÿЃÄƒøÿu`hhhÐFh…j|jè/‰üÿƒÄ3ÀËD$V‹qX;ð^u¸Ã…À~öÂt ‰AX¸ÃhëhhÐFh‚jzjèìˆüÿƒÄ3ÀËL$‹…ÀuhúhhÐFhƒj|j辈üÿƒÄ3ÀË@,…ÀuhÿhhÐFh„j|j虈üÿƒÄ3ÀËT$R‹T$R‹T$RQÿЃÄƒøÿuhhhÐFh…j|jèaˆüÿƒÄ3ÀøÍIËD$3ɉH ‰H‰H ‰H¸ÃV‹t$…öu3À^ËF…Àt)‹F …Àt‹FjPè:©‹NQèÑüÿÇF ÇF¸^ÃV‹t$ 3ÀW…ötQPè ©‹|$ ‹D$jP‹OVQè‰ûûÿ‹O‹ðƒáð…ö‰O%tƒþÿuèÔ¨ƒøt ƒø t=3'u‹G ‰G‹Æ_^ÃVWj賨‹|$ ‹D$‹L$j‹WPQRè>ôûÿ‹O‹ðƒáð…ö‰O%tƒþÿuèy¨ƒøt ƒø t=3'u‹G ‰G‹Æ_^ËD$WH¿=„‡ 3ÉŠˆèQEÿ$ÌQEV‹t$ …öt0‹F…Àt)‹F …Àt‹VjRè ¨‹FPè üÿÇF ÇF‹L$‹D$‹‰F‰V‰~ ^‹Ç_ËD$‹H …Ét‹L$…Ét‹P‰‹x‹Ç_ÃÏÿ‹Ç_ËD$‹x‹Ç_ËT$‹L$‹Ç_‰JÃ3ÿ‹Ç_ÃÆQE¬QE·QEÈQE5QE†QEÆQEV‹t$ W‹þƒÉÿ3Àò®÷ÑIP‹ùèâ¦jW‹|$V‹GPèuòûÿ‹O‹ðƒáð…ö‰O%tƒþÿuè°¦ƒøt ƒø t=3'u‹G ‰G‹Æ_^ø@ÍIÃVWjahØÐFj è —üÿ‹ð3ÿƒÄ ;÷u_3À^ÃjchØÐFhèÿ–üÿƒÄ ;ljFuVèo™üÿƒÄ3À_^ÃjehØÐFhèÖ–üÿƒÄ ;ljFu‹FPèC™üÿVè=™üÿƒÄ3À_^ËD$ ÇÇF‰~ ‰~‰~‰~‰xÇ@ ‰p _¸^ÃV‹t$…öu3À^ÃW‹~ ‹G…Àt Pèâ˜üÿƒÄ‹…ÿt WèÒ˜üÿƒÄ‹F PèÆ˜üÿƒÄÇF ÇF ÇF_¸^øè–íÿÿ‹D$ SUV…ÀW„!‹|$‹_ …Û„‹G$…À„‹G‹l$ $ðÇD$‰G‹C …ÀtT;Å~‹Å‹s‹{‹È÷‹|$‹ÑÁéó¥‹Ê‹T$ƒáÐó¤‹{‹s ø+ð;è‰{‰s ‰T$„ž‹L$‹|$+èȉL$‹;è5‹O$P‹CPQèiÁýÿ‹ðƒÄ …öWèªÇýÿƒÄ…ö|TtbÇC‰s éjÿÿÿ‹T$‹G$URPè3Áýÿ‹ðƒÄ …öWètÇýÿƒÄ…ö|t,‹L$Î;î‰L$t‹L$Î+î‰L$뽋D$…À‹Æ_^][YËD$_^][YÃ3À_^][YøèFìÿÿ‹D$ SUV…ÀWÇD$„†‹l$ …íŽz‹|$‹_ …Û„k‹G$…À„`‹G$ð‰G‹C‹s‹S+Æ+Â;Åù‹S…Ò„‡…À~;‹{‹t$‹Èú‹Ñ+èÁéó¥‹Ê‹T$ƒáÐó¤‹|$‹Køȉ|$‹|$‰T$‰K‹K‹S‹CÊ‹W$PQRè«Àýÿ‹ðƒÄ …öWèLÆýÿƒÄ…öŒ¯„¹‹K‹CÎ+ƉK‰Cu¸‹CÇC;è|D‹D$‹O$UPQè\Àýÿ‹ðƒÄ …öWèýÅýÿƒÄ…ö|dtr‹T$‹L$ÖÎ+î‰T$‰L$tZ;k}¼‹C‹s‹S+Æ+Â;ÅŒÿÿÿ‹{‹S‹t$‹Íú‹ÑÁéó¥‹Êƒáó¤‹C_Å^‰C‹D$Å][YËD$…À‹Æ_^][YËD$_^][YÃ3À_^][YÃSU‹l$V‹t$WEÿ»‹~ ƒøy‡P3ÉŠˆÈZEÿ$œZE3À‰G‰G ‰G‰G‹v$;ðu_^][ËT$ ‹D$RPUVèöÁýÿƒÄ‹Ø_^][Ë__^‹Ã][ËO‹G‹ 3Û;Ç€< uC@;Ç|ô_^‹Ã][Ë_…Û…õ‹v$…öu_^]3À[ËL$ ‹T$QRUVè’ÁýÿƒÄ‹Ø_^][Ë_ …Û…Á‹v$…ö… _^]3À[Ët$‹;ð~0hAhØÐFVè!’üÿ‹ØƒÄ …Û„Þ‹G…Àt P臔üÿƒÄ‰_‹ÎÇG‹Ñ‰w ‹t$ ‹Áéó¥‹Ê»ƒá‹Ãó¤_^][ËD$ …Àtƒ8u ‹G‹l$‰D$ ë‹L$‹/‰L$ ë‹l$‰l$ ‹W‹wý‰T$~!;/t‹D$hchØÐFPè|‘üÿ‹ðƒÄ …öt=‹D$ =~Q;GtL‹L$hhhØÐFQèO‘üÿƒÄ ‰D$…Àu-;wt V蹓üÿƒÄhµhØÐFjAjrj è!üÿƒÄ3À_^][ËG;ÆtP芓üÿƒÄ3À‰w‰G‰G ‰/‹G‹L$;Á„_Pèe“üÿ‹T$ƒÄ3À‰W‰G‰G‹D$ ‰G_^‹Ã][ËF$…Àu_^][ËL$ ‹T$‹~QRƒçðUP‰~èÏ¿ýÿV‹ØèçÂýÿƒÄ‹Ã_^][ËF$…Àu_^][ËO…É‹L$ ‹T$QRUP虿ýÿƒÄ‹Ø_^][Ë^ƒãð‰^‹O‹G;È~@‹_+ÈÃQP‹F$PèÚ¼ýÿV‹Øè‚ÂýÿƒÄ…ÛŽ›‹GÉG‹^ƒãð‰^‹O‹G;ÈÀ‹L$ ‹T$3ÀQ‰G‰G‹F$RUPè ¿ýÿƒÄ‹Ø_^][Ë‹t$ jQjuVèe¾ýÿƒÄ…Àt‹WjRjuVèP¾ýÿƒÄ…Àu-3Û_^‹Ã][Ëv$…öu_^]3À[ËD$ ‹L$PQUVèÁ¾ýÿƒÄ‹Ø_^‹Ã][Ã/WEdWEÈWE“YE:ZE”WE[YEnWELXEåWEpZE     ‹D$‹@$…ÀuËL$ ‹T$QRP脾ýÿƒÄ øè&æÿÿ‹D$S‹\$U‹H‹l$KƒáðV‹p WÇD$‰H‹V …Ò~Y‹N‹FÈ3ÿ3À…Ò~#;Ã}ŠˆUŠE€ú t ‹V @;Â|åë¿@‹T$‹NÐ+؉T$‹V +ÐÈ…ÿ‰V ‰NuI…ÛtEë ‹‹T$‹NP‹B$QPè ºýÿ‹øƒÄ …ÿ‹L$QèJÀýÿƒÄÆE…ÿ|t‰~ ÇFé]ÿÿÿÆE‹D$_^][YËD$…Àò‹Ç_^][YËT$W‹úƒÉÿ3Àò®‹D$÷ÑIQRPèÓøÿÿƒÄ _ÃS‹\$V‹t$…öWt2è PSèu€ýÿƒÄ…Àu_^[ÃjjVjPèm~ýÿƒÄƒøt_^3À[Ë|$…ÿt2èâPSè;€ýÿƒÄ…Àu_^[ÃjjWjPè3~ýÿƒÄƒøt_^3À[Ã…öu_^3À[Ã_^¸[ËD$‹H Qè³ÞýÿƒÄËD$ ‹T$‹L$P‹B QPèIÚýÿƒÄ øðÐFËD$‹H QècƒÄËD$ ‹T$‹L$P‹B QPèyƒÄ ËD$‹T$‹H QRè®ƒÄø8ÑFËD$‹HP ‹@`Q‹L$R‹T$P‹D$QRPè¼ ƒÄ¸ËD$‹HPPQR‹P`H ‹D$Q‹L$R‹T$PQRèø"ƒÄ¸ËD$HPP ‹@`Q‹L$R‹T$P‹D$QRPè¬#ƒÄ¸ø€ÑFËD$W‹‹y‹L$;Ïs¸_ËT$SU‹l$V‹t$+×3Û‰T$ +îë‹D$‹P‹@`R .PQVè#‹D$0߃Ä÷;ØvÛ^][¸_ø`ÒFø@ÓFËL$‹‹@ƒàƒøt+ƒøt&‹D$…Àu‹AX‹Q`‹L$RÁàPQèí&ƒÄ ¸ËAX‹Q`‹L$RÁàPQè#ƒÄ ¸ËD$‹HP ‹@`Q‹L$ƒÀR‹T$P‹D$QRPè‰4ƒÄ¸ËD$‹HPPQR‹P`H ‹D$ƒÂQ‹L$R‹T$PQRèÅ<ƒÄ¸ÃU‹l$W‹E‹x‹D$;Çs_¸]ËT$‹D$SV‹t$+×3Û+ƉT$ ‰D$ë‹D$‹U`‹MƒÂQÆRPVèN>‹D$0߃Ä÷;ØvÙ^[_¸]ËD$HPP ‹@`Q‹L$ƒÀR‹T$P‹D$QRPèÉ>ƒÄ¸ø ÔFËL$‹A`‹IX‹ƒÀR‹T$ RQPèD@ƒÄ¸øèÆàÿÿSU‹l$$VW3ÿ;ï‰|$„’‹\$(‹‹p ƒþvh„ÕFh±hlÕFèÏüÿƒÄ L$VT$QRUèzB‹øƒÄ;þt _^]ƒÈÿ[ƒÄËD$ƒø:uI¾€…ÿ~D$jÿPjjjSèäÿÿƒÄjVjSèÓíÿÿ‹Æ™ƒâÂÁøPSèñìÿÿƒÄ‹Ç_^][ƒÄÃøxu¾@ë°= u¾(ë¢h¢hlÕFjljmjèevüÿƒÄƒÈÿ_^][ƒÄÃW‹|$ 3À…ÿtYD$ V‹t$ PjjVèQíÿÿ‹D$ ƒÄ=€u¹:ëƒø@u¹xë3Ƀø(•ÁIá ‹ƒÆ‹B PVQWè€@ƒÄ^_ËD$ƒèt;ƒèt!HtƒÈÿËD$ …À~‹L$‹Q`‰¸Ã3ÀËD$‹H`‹D$‹‰¸ËD$‹HX‹P`Áበ¸ø˜ÕFËD$P‹D$‹HX‹P`QRèzBƒÄ ¸ËD$‹L$ ‹T$P‹D$QR‹H`QèDCƒÄ¸ËD$W‹‹D$‹y;Çs¸_ËL$SU‹l$V‹t$+Ï3Û‰L$ +î‹T$ .‹B`PQVè¼F‹D$,៎ ÷;Øvß^][¸_ËD$‹HP ‹@`Q‹L$R‹T$P‹D$QRPè,GƒÄ¸ËD$HPP ‹@`Q‹L$R‹T$P‹D$QRPèUƒÄ¸ËD$‹HPPQR‹P`H ‹D$Q‹L$R‹T$PQRè¨VƒÄ¸øÖFøØè†Ýÿÿ‹„$èV‹´$à…Àu‹‹@ƒàƒøtƒøu!‹N`‹”$äQRè@XƒÄ¸^ÄØÃ‹Œ$äD$PQèX‹V`D$ RPèÀYL$hØQèñýÿƒÄ¸^ÄØÃU‹l$W‹E‹x‹D$;Çs_¸]ËL$S+ÏV‹t$‰L$ ‹L$3Û+ΉL$ë‹L$‹E`‹URÎR€RPQVè£Z‹D$8߃Ä÷;ØvÎ^[_¸]ËL$‹A`QPƒÁ RQˆ€Q‹L$R‹T$P‹D$$PQRè.[ƒÄ ¸ËL$‹A`‹QƒÁ RQˆ€Q‹L$R‹T$P‹D$$PQRèe­ýÿƒÄ ¸ËD$‹P‹H`RPPƒÀ RP‘€P‹D$ R‹T$ Q‹L$ PQRèJ\ƒÄ$¸øÈ×FÃV‹t$W‹|$‹F`PWè|Ãüÿ‹N`ƒÇÁ€QWèiÃüÿ‹v`¹ ƒÄ¸¾ó¥_^ÃV‹t$W‹|$‹F`PWè,Ãüÿ‹N`WÁ€QRèÃüÿ‹F`ƒÇPWèÃüÿƒÄ¸_^ËD$W‹‹y‹L$;Ïs¸_ËT$SU‹l$V‹t$+×3Û‰T$ +îë‹D$‹P‹@`R .PQVèFÁüÿ‹D$0߃Ä÷;ØvÛ^][¸_ËD$HPP ‹@`Q‹L$R‹T$P‹D$QRPè ]ƒÄ¸ËD$‹HP ‹@`Q‹L$R‹T$P‹D$QRP躩ýÿƒÄ¸ËD$‹HPPQR‹P`H ‹D$Q‹L$R‹T$PQRèX^ƒÄ¸ø¨ØFËD$‹T$‹H`QRè¾ÁüÿƒÄ¸áÜJ…Àu}ÇÜJèˆlüÿèÓcèžcèicè4cèÿbèÊbè•bè`bè+bèöaèÁaèŒaèWaè"aèí`è¸`èƒ`èN`è`èä_è¯_éz_øˆÙFøÃV‹t$W‹|$;÷t‹L$‹ÁÁéó¥‹Èƒáó¤_¸^ÃSUVW‹|$3Û…ÿu_^]3À[Ël$…íu WèüÿƒÄ‹ðë‹õ…öu_^]3À[˃øtƒøt ƒøtu»ë »Dë»1‹G‹QèÊáüÿPè˜üÿƒÄƒøt ƒøtu€Ïë€ÏVè™”üÿƒÄƒø@€Ï…íu V蔘üÿƒÄ_^‹Ã][ËD$…Àuèchýÿ‹L$‰÷ØÀƒàÃøuV‹t$ ‹Rè³iýÿƒÄǸ^øËD$ ‹L$‹T$hÚFPQRèçýÿƒÄËD$‹L$hÚFPQè|'ýÿƒÄ ËD$‹L$ ‹T$P‹D$QRPh<ÚFhÀíAèÝaƒÄËD$‹L$ ‹T$P‹D$QRPhtÚFhpæBè­aƒÄøèF×ÿÿ‹„$ ‹Œ$SU‹¬$,T$UPQhÜÚFD$ RL$(3ÛPQ‰\$4‰\$(‰\$0‰\$$èÑbƒÄ…Àu ][ÄËT$VW‹|$ ‰T$¾€ÚF‹ÇŠŠÊ:u:ËtŠPŠÊ:VuƒÀƒÆ:Ëuà3ÀëÀƒØÿ;Ãu%‹D$‹”$,L$PQRjèÖþÿƒÄ‰D$é¾ÚF‹ÇŠŠÊ:u:ËtŠPŠÊ:VuƒÀƒÆ:Ëuà3ÀëÀƒØÿ;Ãu%‹D$‹”$,L$PQRjtè}þÿƒÄ‰D$éD¾ÐÚF‹ÇŠŠÊ:u:ËtŠPŠÊ:VuƒÀƒÆ:Ëuà3ÀëÀƒØÿ;Ãu5‹D$L$PQSèmþÿ‹ðƒÄ ;ó„ùVèšþÿV‰D$èpþÿƒÄéÛ¾¸ÚF‹ÇŠŠÊ:u:ËtŠPŠÊ:VuƒÀƒÆ:Ëuà3ÀëÀƒØÿ;Ã…©‹D$L$PQSè`þÿ‹øƒÄ ;û„Œ‹„$0U;ÃSht T$0RÿÐë D$0Pè>`ƒÄ;à jfh ÚFjhë^L$$PQWèÀpW‹ðèHþÿƒÄ;ót:VèÛþÿ‹¼$0ƒÄ‹è;û‰l$t‹;Ãt Pè;•üÿƒÄ‰/VèþÿƒÄ9\$ujuh ÚFj jgj èUküÿƒÄ‹T$ RèÈüÿ‹D$ Pè¾üÿ‹D$ƒÄ_^][Äø@è–ÔÿÿSUV‹t$\3ÀW…öt ‹\$T¸‰3ë ‹\$T‹ ‰L$`‹ñ‹L$X…É„)‹~@ƒÿ@vhÛFjRhÛFèÚÂüÿƒÄ ‹l$\;ý}.‹T$d{RVWèëüÿ‹D$dUPWè$ìüÿs4K8VQWè6ìüÿƒÄ$ë5ƒý@vhìÚFj\hÛFè‹ÂüÿƒÄ ‹t$X‹Í‹Ñ{8Áéó¥‹Êƒáó¤s4‰.‹6ƒþ@t¹@3À+Î|8‹ÑÁéó«‹Êƒáóª‹t$`3ÀŠL8€ñ6ˆL@ƒø@|ï‹l$d{UVWèdêüÿ‹V@D$RPWè…ëüÿƒÄ3ÀŠL8€ñ\ˆL@ƒø@|ï{$UVWè4êüÿ‹V@D$RPWèUëüÿƒÄKƒÃQSèåëüÿƒÄ_^][ƒÄ@Ã…Àtäé{ÿÿÿ‹D$ ‹T$‹L$PƒÂQRèëüÿƒÄ ø$èÓÿÿVW‹|$0D$0L$PwQVè ëüÿƒÇ$WVèƒëüÿ‹T$DD$RPVèÓêüÿ‹L$X‹T$TQRVèãêüÿƒÄ,_^ƒÄ$ÃV‹t$FPèRéüÿN$QèIéüÿƒÆVè@éüÿƒÄ ^ÃW‹|$GPè²íüÿO$Qè©íüÿWRè íüÿ¹3ÀƒÄ ó«_ËD$PhJèAÍýÿƒÄËL$‹A…Àt‹T$RT$jRQÿЃÄ…Àt‹D$Ãh€h4ÛFh’h¹j&èohüÿƒÄ3ÀøhÍIËL$V3ÀW‹q ‹L$ƒéug‹D$ƒøuOjèlmPVè%‹øƒÄ …ÿuh‚hxÛFjgjfj èhüÿƒÄ‹Ç_^ÃèZmPÿFjPVèêƒÄ_^ËT$PRVèØƒÄ _^ÃVWh•hxÛFjè½yüÿ‹ð3ÿƒÄ ;÷u_3À^ÃèHGýÿ;ljuVè|üÿƒÄ3À_^ËD$ ‰~‰~‰~ ‰~‰p _¸^ËD$VW3ÿ‹p ‹F…À~‹N‹¹…Àt PèÎ{üÿƒÄ‹FG;ø|å‹F…Àt Pè¶{üÿƒÄ‹F …Àt Pè¦{üÿƒÄ‹…Àt Pè÷FýÿƒÄVèŽ{üÿƒÄ_^ø èvÐÿÿ‹D$SUV…ÀW„°€8„§‹\$ ‰D$$‰D$Š€ù;t„É…b‹|$$‹èH+ï‰|$‰L$$tÜ‹C3ö…À~‹SUW‹²PÿüF‹CƒÄ F;ð|æ‹K‹CA;Á¾ƒÀ hÐhxÛF‰C…Rè^xüÿ‹ø‹ChÒhxÛFÁàP‰|$,èBxüÿƒÄ‰D$ …ÿ„â…À„Ú‹K‹s Øÿÿÿ‹ÑÁéó¥‹Êƒáó¤‹K‹s ‹ø Øÿÿÿ‹ÑÁéó¥‹Êƒáó¤‹K…Ét Qèfzüÿ‹D$$ƒÄ‹K …Ét QèRzüÿ‹D$$ƒÄ‹L$‹|$‰K‰C ‹S‹C ‹L$(hä‰ UhxÛFRèwüÿ‹K‹SƒÄ ‰Š‹C‹K‹…ÀtfUWPÿ0F‹S‹CƒÄ ‹ Æ)‹C@‰C‹D$€8t@‰D$é€þÿÿhÕhxÛFjAë_^]¸[ƒÄ Ãh»hxÛFjqjdj è!eüÿƒÄ_^]3À[ƒÄ ø´è†ÎÿÿUW‹¼$È3í;ý‰l$ u _3À]ĴË„$ÄVƒø‰D$u!D$tL$ ‰D$ ‰¼$ˆ‰L$ÇD$ õIë%ƒø…T$0D$ ‰T$ ‰|$8‰D$ÇD$ ÔÒHSè+Dýÿ‹ð;õu4hhxÛFjjgj èpdüÿƒÄ…ö[t VèBDýÿƒÄ‹D$^_]ĴËŒ$ÈW‹Y ètüÿ‰D$‹CƒÄ;Å~Æ‹SƒÉÿ3À‹<ªò®÷уÁQVè:DýÿƒÄ…À„H‹D$‹S‹L$jP‹ªQ‹NPhÛFQÿF‹F”$¸RP¿ÿ FƒÄ …ÀŒ‹„$̃øu!‹K ‹F‹©‹Œ$ÈRPQè÷ƒÄ …Àteë$ƒøu‹S ‹N‹ª‹”$ÈPQRèQƒÄ …Àt?‹D$‹S‹L$WP‹ªQ‹NPhÛFQÿF‹F”$¸RPGÿ FƒÄ …ÀpÿÿÿhHhxÛFj jè¸üÿ‹¼$ØL$,Q‹W‹BPè¬üÿƒÄƒøÿt‹OP‹QRè»­üÿƒÄ‹øë3ÿhLhxÛFj jèÏ·üÿƒÄ…ÿu"‹CE;茙þÿÿéZþÿÿh+hxÛFjAé=þÿÿ‹„$Ô‹ÇD$‰‹W‰Pé+þÿÿhhxÛFjpjgj èƒbüÿ‹D$$ƒÄ^_]ĴøÍIËL$3ÀIVu\‹D$ƒøuUè¸gPÿFƒÄ…ÀjtP‹D$Pë è{g‹L$ PQèp‹ðƒÄ ÷Þö÷Þ…öujrh¸ÛFjhjej èÿaüÿƒÄ‹Æ^Ãøu‹T$P‹D$ RPè3ƒÄ ÷ØÀ^÷ØÃ‹L$‹T$PQRèƒÄ ÷ØÀ^÷ØÃ¸è&ËÿÿSV‹t$3Û…öÇD$u ^¸[YÃUW貦ýÿPèLžýÿ‹øƒÄ…ÿ„VjjlW蔢ýÿƒÄ…ÀŽ‹D$ ƒø… jjjWèÀf‹ðƒÄ…öt1‹l$‹EVPèyhýÿƒÄ…ÀtRVCè wüÿjjjWèf‹ðƒÄ…öuÓè±büÿ%ÿƒølu…Û~ èÞaüÿ‰\$ëh¢h¸ÛFj joj èÓ`üÿƒÄ…öt Vè¶vüÿƒÄ…ÿt Wè9žýÿƒÄ‹D$_]^[YÃøu:jWèï`ýÿ‹ðƒÄ…öuh³h¸ÛFj 묋L$V‹QRèÊgýÿƒÄ…Àt£‰D$ëh¼h¸ÛFjdjoj èX`üÿƒÄëhŽh¸ÛFjjoj è>`üÿƒÄésÿÿÿ¸è¦ÉÿÿSV‹t$3Û…öÇD$u ^¸[YÃUWè2¥ýÿPèÌœýÿ‹øƒÄ…ÿ„VjjlWè¡ýÿƒÄ…ÀŽ‹D$ ƒø… jjjWèÀñÿÿ‹ðƒÄ…öt1‹l$‹EVPèéhýÿƒÄ…ÀtRVCè nýÿjjjWèñÿÿ‹ðƒÄ…öuÓè1aüÿ%ÿƒølu…Û~ è^`üÿ‰\$ëhåh¸ÛFj jpj èS_üÿƒÄ…öt Vè¶mýÿƒÄ…ÿt W蹜ýÿƒÄ‹D$_]^[YÃøu:jWè_ýÿ‹ðƒÄ…öuhöh¸ÛFj 묋L$V‹QRè:hýÿƒÄ…Àt£‰D$ëhÿh¸ÛFjdjpj èØ^üÿƒÄëhÑh¸ÛFjjpj è¾^üÿƒÄésÿÿÿ‹D$ U3íVƒøWt‹L$P‹D$PQèâüÿÿƒÄ _^]ËT$hÔÒHRèì¢ýÿ‹ðƒÄ…öuhh¸ÛFjë'jjjVèÉdV‹øèÑ›ýÿƒÄ…ÿu!hh¸ÛFj h„j è2^üÿƒÄ3À_^]ÃSW3ÛèШüÿƒÄ…À~KSWèÒ¨üÿ‹ðƒÄ‹…ÀtP‹D$‹HQèIeýÿƒÄE‹v…öt‹T$V‹BPè gýÿƒÄEWCè…¨üÿƒÄ;Ø|µh ÞEWèó§üÿƒÄ‹Å[_^]øè&ÇÿÿVƒÎÿè}´ýÿ…À‰D$uƒÈÿ^YËD$L$PT$QRè´ýÿƒÄ …Àt‹D$ ‹T$PR‹H<‹D$‹T$PRÿQ ƒÄ‹ð‹D$Pè;´ýÿƒÄ‹Æ^YËT$W¹3ÀzTÇó«z¹ƒÂó«‰_‰B‰B‰B ¸ÃSU‹l$V…íW„ ‹\$‹S…ÀtO (ƒù‚‘‹t$¹+È<‹ÁRÁéó¥‹ÈSƒáó¤è¤‹‹T$ ¹ƒÄ+Èl(ðÑljT$¿;ïr"‹õÁî‹D$PSèk‹T$ ƒÄ×+ïN‰T$uã‹t$‹Í‹Ñ{Áéó¥‹Êƒáó¤‰+_^]¸[Ët$‹Í<‹ÑÁéó¥‹Êƒáó¤‹_Å^‰]¸[øÌè†Åÿÿ‹Œ$ÐSUVqATW|$\‹N<3í‰L$Œ$œ+È+ø‰D$‰L$+ð‹œ$ä‹3ɉTÀŠ +‹\$3щ ‰‹T$3ʃÀ‹¼ÍI‹Lü3ÊE‰Lüƒý‰L$|¾3É3öD$ º‹ ¼ÍI‹xü3ù‹Ï‰xü‹(ƒÀ ‹ ¼ÍI3é‹Í‰hà‹Xä‹ ¼ÍI3ًˉXä‹xè‹ ¼ÍI3ù‹Ï‰xè‹hì‹ ¼ÍI3é‹Í‰hì‹Xð‹ ¼ÍI3ًˉXð‹xô‹ ¼ÍI3ù‹Ï‰xô‹hø‹ ¼ÍI3éJ‰hø‹Í…oÿÿÿÎáÿFƒþŒTÿÿÿ‹|$¹t$T$hÀRó¥è#ûüÿƒÄ_^][ÄÌÃU‹l$ V‹UET‰D$¸+ƒúu}(SŠØ¹ŠûW+Ê‹Ã<2‹ÑÁàf‹ÃÁéó«‹Êƒáóª_[VUèRþÿÿƒÄ3ÀMŠƒÁˆ0@ƒø|òVUè5þÿÿ‹L$‹t$ƒÄ3ÀŠƒÁˆ0@ƒø|ò^¸]ÃSU‹l$3ÀVW…ítS‹\$‹‹x ƒÿvhÜFj]høÛFè²üÿƒÄ sWVUè$ƒÄ ;Çt_^]ƒÈÿ[Ã…À~‹Ï{ ‹ÑÁéó¥‹Êƒáó¤_^][ÃS‹\$ 3À…Ût4VW‹|$‹‹p ƒþvh$ÜFjnhøÛFè”±üÿƒÄ ƒÇVWSèV#ƒÄ _^[øèÖÂÿÿ‹D$(‹T$SUVƒøW‰T$,….‹\$4ƒú‚‹l$(Áê‰T$4‹t$$|$+ó‹Ã+û¹Š2@IˆTÿuó‹D$0L$PUQè• ‹Õ‹Ã‹t$8ƒÄ ‹ ‰‹J‰H‹J‰H‹R ‰P ‹T$$¸+ðÐè‹D$4H‰t$,‰T$$‰D$4u‹Ö…Ò„šv'‹t$$|$+ó‹Ã+û‰T$$Š 02@ˆL8ÿ‹L$$I‰L$$uëƒús¹|+Ê4‹ÑÁéó¥‹Êƒáó¤‹D$0L$PT$QRèê‹D$‹L$ ‹T$$‹t$(‰E‰M‰U‰u ƒÄ ‰‰K‰S‰s _^][ƒÄËl$(é_ÿÿÿ‹\$4ƒú‚ü‹t$(‹|$$Áê‰T$4‹Ç‹‰L$‹P‰T$‹H‰L$‹P ‹D$0PVW‰T$(è‹ËƒÄ ‹Æ+νŠ0@Mu÷‹L$‹T$‹Ã‹l$,ƒíƒÇ‰‹L$ƒÆ‰l$,‰P‹T$‰H‰P ‹D$4H‰D$4u‡‹Õ…Òtf‹‹O‹W‰D$‹G ‰L$‹L$0‰T$‰D$T$QD$RPè• ‹|$8ƒÄ …ÿv‹Ã+ÆŠ Š2шFOuó‹T$‹D$‹L$‰‹T$‰C‰K‰S _^][ƒÄËt$(‹|$$ë„‹L$‹D$SUV‹1…À‹D$WtT…À„•‹|$$‹\$‹l$‰D$…öu‹D$ PWWèR‹L$4ƒÄ ŠEŠ>2ˆCˆ>‹D$EFƒæH‰D$uˉ1_^][Ã…ÀtE‹|$$‹\$‹l$‰D$…öu‹L$ QWWè‹L$4ƒÄ ŠEŠ>2ЈCEˆ>‹D$FƒæH‰D$uˉ1_^][ËD$‹L$‹T$ƒø‹D$ PQRu è³ƒÄ ÃèZ ƒÄ ËL$‹D$ V‹1…ÀtKS‹\$ U‹l$ W‹|$‰D$…öu‹D$ PUUèn‹L$4ƒÄ Š.Š2ЋD$ˆGCFƒæH‰D$uÏ_]‰1[^É1^ÃSV‹t$ W…ö„©‹T$…Ò„‹\$û€t!ûÀtût _^¸þÿÿÿ[Ãû€u Ç‚ð ëûÀu Ç‚ð ë Ç‚ð‹‹ÈÁÉáÿÿÁÀ%ÿÿ ȉ ‹~‹ÇJÁÈ%ÿÿÁÇçÿÿ lj‹~‹ÇÁÈ%ÿÿÁÇçÿÿ ljB‹~ ‹ÇÁÈ%ÿÿÁÇçÿÿ Çû€‰B …”¿8G‹q3À‹Ö3Û‰T$ŠÆŠ\$ƒÇ‹…8ìF‹8ìF%ÿãÿ3ËÚÁëâÿ‹8ìF‹•8ìFãÿ3Ë_üâÿ3‹Qü3‹3ÉA 3‹Q‰A3ЉQ3Öÿ`G‰Q„<ƒÁéqÿÿÿ‹~‹ÇÁÈ%ÿÿÁÇçÿÿ ljB‹~‹ÇÁÈ%ÿÿÁÇçÿÿ ÇûÀ‰B…§¾8G‹Q3À‰T$3ÛŠ\$ŠÆƒÆ‹…8ìF‹<8ìF%ÿçÿ3Ç‹úÁïâÿ‹^ü‹<½8ìF‹•8ìFçÿ3Çâÿ3‹Qü3‹3ÉA3ЋA‰Q3‹Q3ÐþXG‰A‰Q „e‹A ‹Ú‹Q3Ã3ЉA$‰Q(ƒÁé^ÿÿÿ‹~‹ÇÁÈ%ÿÿÁÇçÿÿ ljB‹v‹ÆÁÈ%ÿÿÁÆæÿÿ Æû‰B… ‹Á¿8G‹P3ɉT$3ÛŠ\$ŠÎƒÇ‹ 8ìF‹48ìFáÿæÿ3΋òÁîâÿ‹_ü‹4µ8ìF‹•8ìFæÿ3Îâÿ3Ê‹Pü3Ê‹3ˉH3Ñ‹H‰P 3Ê‹P3ÑÿTG‰H$‰P(t}‹Ê3Ò‰L$ŠT$‹4•8ìF3ÒŠÕæÿ‹•8ìFâÿ3ò‹ÑÁêáÿ‹•8ìF‹ 8ìFâÿ3ò‹Páÿ3ñ‹H 3ñ‹H3Ö‰p,‰P03Ê‹P‰H43ʉH8ƒÀ éþþÿÿ_^3À[Ã_^ƒÈÿ[ËD$‹L$U‹l$UPQè+üÿÿƒÄ …ÀŒT‹•ðSV3öÁâ…ÒW~CL•E‹Yø‹xø‰Xø‰yø‹Yü‹xü‰Xü‰yü‹‹8‰‰9‹Y‹x‰X‰yƒÆƒêƒÀƒé;ò|Ä‹…ð¾;ÆŽçE‹HƒÀ3Û‰L$ŠÝ3ÒŠT$‹<8ìF‹•8ìFçÿâÿ‹½8øF‹ù‹•8ôFáÿÁï‹ 8ìF3Ó‹<½8ìFáÿçÿ‹½8ðF3Ó‹8üF‹Hü3Ó3Û‰PøŠÝ‰L$3Ò‹<8ìFŠT$çÿ‹•8ìF‹½8øF‹ùÁïâÿáÿ‹<½8ìF‹•8ôF‹ 8ìFçÿ3Óáÿ‹½8ðF3Ó‹8üF‹3Ó3Û‰PüŠÝ‰L$3Ò‹<8ìFŠT$çÿ‹•8ìF‹½8øF‹ùÁïâÿáÿ‹<½8ìF‹•8ôF‹ 8ìFçÿ3Óáÿ‹½8ðF3Ó‹8üF‹H3Ó‰‰L$3ÒŠT$‹•8ìF3ÛâÿŠÝ‹•8ôF‹<8ìFçÿ‹½8øF‹ùÁïáÿ3Ó‹<½8ìF‹ 8ìFçÿáÿ‹½8ðF‹<8üF3Ó3×F‰P‹ð;ñŒþÿÿ_^3À[]øèÖ¸ÿÿS‹\$UV‹W‹|$,‹ÈÁÉ‹7áÿÿÁÀ%ÿÿ È‹C3΋ðÁÎæÿÿ‰L$ÁÀ%ÿÿ ð‹G3ð‹C‹Ð‹[ ÁÊâÿÿ‰t$,ÁÀ%ÿÿ ЋG3ЋÃÁÈ%ÿÿ‰T$ÁÃãÿÿ Ë_ 3Ã3ÛŠÞ‰D$Áî‹8äF3ÛŠ\$.‹,8àF‹ÙÁë3Õ‹,8ÜF‹Øãÿ3Õ‹,8èF3ÛŠÜ3Õ‹o3ÀŠD$3Õ‹,8äF‰T$‹…8àF‹Á3답8ÜF‹w%ÿ3ë3,…8èF3À3ÛŠD$ŠÝ3î‹…8àF‹ 8äF3Á‹L$Áé‰l$$‹48ÜF‹L$,3Æ‹ñæÿ‹µ8èF3Ë_3Ã3ۊ݉D$,‹ 8äF3ÛŠ\$‹48àF3΋t$Á8ÜF‹t$æÿ3Ë‹µ8èF‹w3Ë3Îw ‹¿ð‰L$ÑÿO„0‹ï3Ò3ÛŠ\$&ŠÔ‹<•8äF‹8àF3ú‹T$‹ÚÁë3<8ÜF‹Ùãÿ3<8èF‹3û3ۊ݉|$‹ 8äF3ÛŠ\$.‹<8àF3Ï‹|$$Á8ÜF‹úçÿ3Ë‹½8èF‹~3Ë3Û3ÏŠÞ‰L$,3ÉŠL$‹8äF‹ 8àF3Ê‹ÐÁê%ÿ‹<•8ÜF‹T$$3Ï‹úçÿ‹½8èF3Ë‹^3Ë3ÛŠÞ‰L$‹8äF3ÛŠ\$‹<8àF3׋|$Á8ÜF‹~ 3Ó‹…8èF3Ó3À3ÛŠÅŠ\$.3׋<…8äF‰T$‹8àF3ø‹D$‹ØÁë3<8ÜF‹ÚãÿƒÆ 3<8èF‹^ð3û3ÛŠÞ3ÒŠT$‰|$‹<8äF‹•8àF‹T$,Áê3û‹•8ÜF‹Ðâÿ3û‹•8èF3ÒŠT$3û‹^ô3û3ÛŠÜ‹•8àF‰|$$‹8äF3‹ÑÁêáÿ‹<•8ÜF‹T$,3Ç‹úçÿ‹½8èF‹~ø3Ã3ÛŠÞ3ÒŠT$3Ç‹<8äF‰D$,‹•8àF‹T$Áê3û‹•8ÜF‹8èF3û‹^ü3ú3ûM‹Ï‰L$…Úýÿÿ‹T$‹l$$3ÛŠ\$&Áí‹<8ìF3ÛŠÜçÿ‹8ìFãÿ3û‹ÚÁë‹8ìFãÿ3û‹Ùãÿ‹8ìFãÿ3û‹3û‹ßÁËãÿÿÁÇçÿÿ ß‹|$(‰3ÛŠ\$.‹<8ìF3ÛŠÝçÿ‹8ìFãÿ3û‹­8ìFãÿ‹l$(3û‹Úãÿ‹8ìFãÿ3û‹^3û‹ßÁËãÿÿÁÇçÿÿ ߉]3ÛŠ\$‹<8ìF3ÛŠÞçÿ‹8ìFâÿ3ú‹ÐÁê‹•8ìFâÿ3ú‹T$$‹Úãÿ‹8ìFãÿ3û‹^3û‹ßÁËãÿÿ%ÿÁÇçÿÿ ߉]3ÛŠ\$Áé‹<8ìF3Û‹ 8ìFŠÞçÿáÿ‹8ìFâÿ3ú‹…8ìF3ùâÿ3ú‹V 3ú‹ÇÁÈ%ÿÿÁÇçÿÿ Ç_‰E ^][ƒÄøè&³ÿÿS‹\$UV‹W‹|$0‹ÐÁÊ‹7âÿÿÁÀ%ÿÿ‹K ЋC3Ö‹ðÁÎæÿÿ‹[ ÁÀ%ÿÿ‰T$ ð‹G3ð‹ÁÁÈ%ÿÿ‰t$ÁÁáÿÿ Á‹O3Á‹ËÁÉáÿÿ‰D$(ÁÃãÿÿ Ë‹_ 3Ë3Û‰L$03ÉŠL$2ŠÜ‹8ôF‹ 8øF3Á‹ÊÁé‹8ðF‹Îáÿ3ÃÁî‹8üF‹O3Ã3ÛŠ\$3Á3ɉD$ ŠL$1‹,8ôF‹µ8ðF‹t$(‹ 8øFæÿ3Í3Ë‹µ8üF‹w3Ë3Î3Û‰L$3ÉŠL$ŠÞ‹T$(‹ 8ôF‹,8øFÁê3Í‹,•8ðF‹T$0âÿ3Í‹o‹4•8üF3ÒŠT$3Î3Í‹•8øF‹T$0‰L$3ÉŠL$*Áê‹ 8ôF‹,•8ðF‹T$âÿ3Ë3Í‹o‹4•8üF3Îw ‹¿ð3ÍÑÿO‰L$0„8‹ï3Ò3ÉŠT$ŠL$2‹<•8øF‹ 8ôF‹Ð3ÏÁê‹<•8ðF‹T$3Ï‹úçÿ‹½8üF3Ë‹3Ë3ÛŠ\$"‰L$3ÉŠL$1‹<8ôF‹ 8øF3Ï‹úÁ8ðF‹|$çÿ3Ë‹½8üF3Ë‹^3Ë3Û‰L$3ÉŠL$ŠÜ%ÿ‹ 8ôF‹<8øF3Ï‹|$Á8ðF‹|$0çÿ3Ë‹½8üF‹~3Ë3Û3ÏŠÞ‰L$(3ÉŠL$‹8øF‹ 8ôF3Ê‹T$0Áê‹•8ðF‹…8üF3Ë‹^ 3Ê3À3Ë3ÒŠT$)‰L$0ŠD$2‹<•8øF‹T$‹…8ôF3Ç‹úÁïƒÆ ‹½8ðF‹|$3ËßãÿÁï38üF‹^ð3Ã3ÛŠÝ3ÉŠL$‰D$ ‹8øF38ôF‹ ½8ðF3Ù‹L$(áÿ‹<8üF3ÉŠL$3ß‹~ô3߉\$3ÛŠÞ‹8ôF‹ 8øF‹^ø3Ñ‹L$(Áé‹<8ðF‹L$0áÿ3׋<8üF3ÉŠL$3×3Ó‹^ü‹<8øF‹L$0‰T$3ÒŠT$*Áé‹•8ôF3׋<8ðF‹L$3×áÿ38üF3ÓM‹Ê‰L$0…Êýÿÿ3Ò3ÛŠT$2‹l$,‹<•8G‹T$ŠÞçÿ‹8Gãÿ3û‹ØÁë‹8Gãÿ3û‹\$ãÿ‹8Gãÿ3û‹3û‹ßÁËãÿÿÁÇçÿÿ ߉]3ÛŠ\$"‹<8G3ÛŠÝçÿ‹8Gãÿ3û‹\$Áë‹8Gãÿ3û‹ÚãÿÁê‹8Gãÿ3û‹^3û‹ßÁËãÿÿÁÇçÿÿ ߉]3ÛŠ\$‹•8Gâÿ‹<8G3ÛŠÜçÿ‹8Gãÿ3û3ú‹Ñâÿ‹•8Gâÿ3ú‹V3ú‹×ÁÊâÿÿÁÇçÿÿ%ÿ ׉U3ÒŠT$Áé‹<•8G3ÒŠT$‹ 8Gçÿáÿ‹•8Gâÿ3ú‹…8G3ùâÿ3ú‹V 3ú‹ÇÁÈ%ÿÿÁÇçÿÿ Ç_‰E ^][ƒÄøèf­ÿÿ‹D$ SUV…ÀW„Ê‹\$,3É3À3ÒŠ ŠcC ÈC3ÀŠŠCÁâ ÊCÁà ÈC3À3ÒŠŠsC ÂC3ÒŠÁâ ÂC3ÒŠƒëÁâ ‹T$$ƒÂø‰D$,…ÒŒ3B‹t$ Áè‹|$‰D$0÷؉D$$3À3ÒŠŠwG ÂG3ÒŠÁâ ÂG3ÒŠÁâ ÂG3Ò3ÁŠG‹ê3ÒŠ7‰D$ êG3Ò‹D$(ŠL$Áâ êG3ÒPŠQÁâ ê‹T$43êG‰l$è‹D$ƒÄˆ‹ÐF‹ÈÁꈋÐFÁêˆFÁ舋D$F‹ÐÁêˆF‰D$,ˆ‹ÐFÁêˆFÁ舋D$0FH‰D$0…Lÿÿÿ‹T$$‹D$,ƒúø„U|ƒÂ‰|$3ÿ3íƒú‰|$ ‡Øÿ$•€™E‹l$3ÒMŠU‹ú3ÒŠUÿÁçMÁâ úM3ÒŠu úM3ÒŠU ú‰|$ ë_‹t$ ‹|$ëš‹l$3ÒMŠUÁâ úM3ÒŠu úM3ÒŠU ú‰|$ ë0‹l$3ÒMŠu úM3ÒŠU ú‰|$ ë‹l$3ÒMŠU ú‰|$ ë‹l$M3Ò‰l$ŠU‹êÁå‹|$3ÒOŠÁâ êO3ÒŠ7 êë‹|$3ÒOŠ7 êë‹|$3ÒŠWÿ‹|$ ê3ø‹D$(3éL$PQ‰l$‰|$è+‹D$ƒÄˆ‹ÐF‹ÈÁꈋÐFÁêˆFÁ舋D$F‹ÐÁêˆF‰D$,ˆ‹ÐFÁêÁ興F‹D$,ˆ ‹ÑC_ÁꈋÑC^ÁêˆCÁéˆ C‹È‹ÐˆCÁéˆ CÁêÁ興C][ƒÄËl$,3Û3À3ÉŠ]ŠeE ØE3Ò3ÀŠMŠUÁá ÙEÁâŠE ÚE3ÉE3ÒŠmŠU ÁEÁâ ‹T$$E3ÉŠMƒíÁá ÁJø…ɉD$,‰L$$ŒùA‹|$ Áè‹t$‰D$0÷ØÁ‰D$$3À3ÉŠŠnF ÁF3Ò3ÉŠŠNÁâ ÂFÁá ÁF‰D$‰D$3À3ÒŠŠvF ÂF3É3ÒŠŠVÁá ÁFÁâ ÂL$‰D$ ‰D$‹D$(FPQè)‹L$‹Ã‹\$3Á‹L$4ƒÄ3ˈ‹ÐGÁꈋÐG‹\$ÁêˆGÁèˆG‹Á‹ÑˆGÁ舋D$ G‰D$,‹D$0ÁêˆGÁéˆGH‰D$0…;ÿÿÿ‹D$,‹L$$ƒùø„È3À3ÉŠŠnF ÁF3Ò3ÉŠŠNÁâ ÂFÁá ÁF‰D$‰D$3À3ÒŠŠvF ÂF3É‹T$(ŠnRŠÁá Á‰D$$‰D$D$Pè\‹D$‹L$,‹t$3Ø‹D$4|ƒÁƒÄ3ƃùw=ÿ$ ™E‹ÈOÁ鈋ÐOÁꈋÈOÁéˆOˆ‹ÓOÁꈋÃOÁ舋ËOÁ鈈_ÿ‹T$ ‹\$‰T$,‹Âˆ]‹ËE‹ÓÁéˆMEÁêˆUEÁëˆ]E‹È‹ÐˆEEÁéˆMEÁêÁèˆU_ˆE^][ƒÄË|$ ‹t$éâþÿÿk–E^–EG–E4–E"–E–Eã•E©•E!™E™E™E ™E™Eþ˜Eö˜Eî˜E¸èÖ§ÿÿ‹D$ SU‹l$V‹0W‹x‹Î‹×áÿÿâÿÿÁîÁïÇD$ÇD$‹Ç‹ß÷Ð#Æ#ÚË]ËßÁƒÅ%ÿÿƒÅ‹ÈÀÁé ȃÅ‹Á#Ù÷Ð#ƒÅË]ôÃÆ%ÿÿ‹ðÁîÁà ð‹Æ‹Þ÷Ð#Ç#ÙË]øÃÂ%ÿÿ‹ÐÁê Áà Ћ‹Ú÷Ð#Á#ÞË]üÃÇ%ÿÿ‹øÁï Áà ø‹D$H‰D$…^ÿÿÿ‹D$H‰D$t<‹\$3Àƒû‹ß”ÀƒÀƒã?‰D$‹D$  ˜‹Ùƒã?4˜‹Þƒã?˜‹Úƒã?<˜éÿÿÿ‹D$áÿÿÁæÁçâÿÿ ñ ú‰0‰x_^][ƒÄøèv¦ÿÿ‹D$ S‹\$UV‹pW‹8‹Ï‹Æáÿÿ%ÿÿÁïÁîÇD$º«ü‹ÞƒíÁã Áî Þ‹ð÷Ö#ñƒí+Þ‹ð#÷ƒí+Þ‹u +Þƒíãÿÿ‹ó‹ØÁã Áè Ø‹Ç÷Ð#Æ+Ø‹Ç#Á+Ø‹E +Øãÿÿ‹Ã‹ßÁãÁï ß‹ù÷×#ø+ß‹þ#ù+ß‹}+ßãÿÿ‹û‹ÙÁãÑé Ù‹Î÷Ñ#Ï+Ù‹Î#È+Ù‹M+ÙãÿÿJ‹Ë…Zÿÿÿ‹T$J‰T$tW‹\$3Òƒû‹Ø”ƒÂƒã?‰T$‹T$ +4š‹ßƒã?æÿÿ+š‹Ùƒã?%ÿÿ+<š‹Þƒã?çÿÿ+ š‹T$áÿÿéøþÿÿÁçáÿÿ%ÿÿ ù‹L$Áæ ð‰9‰q_^][ƒÄøèö¤ÿÿ‹T$ ‹D$$SUV‹2…À‹D$ W„ã…À„´‹|$,‹\$‰D$$…ö…”o3ÉŠ‹Å3ÒŠ0 Ê@3ÒŠÁâ Ê@3ÒŠÁâ Ê@‰L$3ÉŠ@3ÒŠ0 Ê@3ÒŠpŠ‹D$(Áâ ÑL$PQ‰T$èüÿÿ‹L$‹Å‹ÑˆÁꈃċÑ@Áêˆ@Á鈋L$@‹ÑÁêˆ@ˆ‹Ñ@ÁêÁ鈋T$0ˆHŠŠ >2Á‹L$ CˆAˆ>‹D$$F‰L$ ƒæH‰D$$…;ÿÿÿ‰2_^][ƒÄÃ…À„Ñ‹|$,‹\$‰D$$…ö…”o3ÉŠ‹Å3ÒŠ0 Ê@3ÒŠÁâ Ê@3ÒŠÁâ Ê@‰L$3ÉŠ@3ÒŠ0 Ê@3ÒŠpŠ‹D$(Áâ ÑL$PQ‰T$èªûÿÿ‹L$‹Å‹ÑˆÁꈃċÑ@Áêˆ@Á鈋L$@‹ÑÁêˆ@ˆ‹Ñ@ÁêÁ鈋T$0ˆHŠŠ >ˆ>2Á‹L$ Cˆ‹D$$AFƒæH‰L$ ‰D$$…;ÿÿÿ‰2_^][ƒÄøè£ÿÿ‹D$ 3É3ÒŠŠp@ Ê@3ÒŠÁâ Ê@3ÒŠÁâ Ê@‰L$3ÉŠ@3ÒŠ0 Ê@3ÒŠpŠ‹D$Áâ Ñ…À‰T$t‹D$L$PQèÊúÿÿë‹T$D$RPèüÿÿ‹D$‹L$ƒÄ‹Ñˆ@ÁꈋÑ@Áêˆ@Á鈋L$@‹ÑÁêˆ@ˆ‹Ñ@ÁêÁ鈈HƒÄøèF¢ÿÿ‹D$0SU‹l$4VW‹8u3À3ÉŠEŠ.‰t$ ÁF3Ò3ÉÇD$ŠŠNÁâ ÂFÁá ÁF3É3ÒŠŠvF ÊF3ҋ؈D$ŠvŠÁâÁë ʈ\$‹Ð‹ØÁèˆD$‹ÁÁèˆD$‹ÁÁèˆD$‹D$4‰L$$ˆL$ÁëÁé…À‰T$ ˆ\$ˆL$„è‹t$0‹\$,‹L$$‰D$<…ÿua‹L$8T$ QRèœùÿÿ‹T$(ƒÄ‹Â‹ÊÁèˆD$‹ÂÁéˆL$‹L$$ÁèˆD$‹ÁÁèˆD$‹ÁÁèˆD$‹ÁÁèˆD$‹D$@ˆT$ˆL$‰D$ŠD<2FCGˆFÿ‹D$<ƒçH‰D$ÿÿÿ‹l$4‹D$‹T$,‹Ëƒúø„Ê3Û3ÉŠŠNÁãF3ÒÁáŠv ÙF ÚF3À3É3ÒŠ ØF3À‰\$ŠŠNÁàFÁáŠv ÁŠVF ÂL$‰D$(‰D$‹D$0PQè‹L$@‹T$$‹D$‹t$ 3Ê‹T$4ƒÄ3Æ|ƒÂƒúw9ÿ$•ЯEOˆ‹ÑOÁꈋÑOÁêˆOÁéˆOˆ‹ÈOÁ鈋ÐOÁêˆÁèˆGÿ‹D$(‰\$‰D$8‹È‹Ã‹Ð_ÁêˆU‹ÐE^ÁêˆU‹ÐEÁêˆUE‹ÑˆE‹ÁEÁèˆEEÁêˆU‹ÁEÁèˆEˆM][ƒÄË|$(‹t$$éÜþÿÿy¬Eo¬Eh¬Ea¬EO¬E=¬E.¬E%¬EH¯E@¯E8¯E5¯E/¯E'¯E¯E¯E¸覑ÿÿ‹D$SUV‹‹p‹D$‹ÓÁê‹(W‹Í‹þ¯ÊÁï…Ét‹ÑáÿÿÁê+Ê‹ÑÁêë¹+̓À+Êæÿÿ‰L$‹ƒÀÚ‹ƒÀú‰\$‹‹ê¯î…ít‹ÕåÿÿÁê+ê‹ÕÁê+êë ½+ê+îƒÀ‹÷3ñ‹æÿÿ‹Ñ¯Ö…Òt‹ÊâÿÿÁé+Ñ‹ÊÁé+Ñë º+Ñ+Ö‹H‹õ3óƒÀòæÿÿ¯Î…Ét‹ñáÿÿÁî+΋ñÁî+Î당+Ë‹\$+΋ñÑ3÷‹|$ƒÀ3ê3Ó3Ï‹8‹Úáÿÿ‹×¯Ñ…Òt‹ÊâÿÿÁé+Ñ‹ÊÁéëº+׋xƒÀƒÀ+Ñåÿÿ÷‹ƒÀÙ‰T$‹‰\$‹Ù¯Ý…Ût‹ÓãÿÿÁê+Ú‹ËÁé+Ùë »+Ù+Ý‹L$‹|$ƒÀ3Ïáÿÿ‹8‹×¯Ñ…Òt‹ÊâÿÿÁé+Ñ‹ÊÁéëº+׋h‹ûƒÀ+Ñ3þ‹Íúçÿÿ¯Ï…Ét‹ùáÿÿÁï+Ï‹ùÁïë¹+Í‹l$+Ï‹|$Ñ3ÚƒÀ3Ö‹ñ3Ï‹83õ‹êáÿÿ‹×¯Ñ…Òt‹ÊâÿÿÁé+Ñ‹ÊÁéëº+׋xƒÀƒÀ+Ñãÿÿ÷‹ƒÀé‰T$‹‰l$‹é¯ë…ít‹ÕåÿÿÁê+ê‹ÍÁé+éë ½+é+ë‹L$‹|$ƒÀ3Ïáÿÿ‹8‹×¯Ñ…Òt‹ÊâÿÿÁé+Ñ‹ÊÁéëº+׋X‹ýƒÀ+Ñ3þ‹Ëúçÿÿ¯Ï…Ét‹ùáÿÿÁï+Ï‹ùÁïë¹+Ë‹\$+Ï‹|$Ñ3êƒÀ3Ö‹ñ3Ï‹83ó‹Úáÿÿ‹×¯Ñ…Òt‹ÊâÿÿÁé+Ñ‹ÊÁéëº+׋xƒÀƒÀ+Ñåÿÿ÷‹ƒÀÙ‰T$‹‰\$‹Ù¯Ý…Ût‹ÓãÿÿÁê+Ú‹ËÁé+Ùë »+Ù+Ý‹L$‹|$ƒÀ3Ïáÿÿ‹8‹×¯Ñ…Òt‹ÊâÿÿÁé+Ñ‹ÊÁéëº+׋h‹ûƒÀ+Ñ3þ‹Íúçÿÿ¯Ï…Ét‹ùáÿÿÁï+Ï‹ùÁïë¹+Í‹l$+Ï‹|$Ñ3ÚƒÀ3Ö‹ñ3Ï‹83õ‹êáÿÿ‹×¯Ñ…Òt‹ÊâÿÿÁé+Ñ‹ÊÁéëº+׋xƒÀƒÀ+Ñãÿÿ÷‹ƒÀé‰T$‹‰l$‹é¯ë…ít‹ÕåÿÿÁê+ê‹ÍÁé+éë ½+é+ë‹L$‹|$ƒÀ3Ïáÿÿ‹8‹×¯Ñ…Òt‹ÊâÿÿÁé+Ñ‹ÊÁéëº+׋X‹ýƒÀ+Ñ3þ‹Ëúçÿÿ¯Ï…Ét‹ùáÿÿÁï+Ï‹ùÁïë¹+Ë‹\$+Ï‹|$Ñ3êƒÀ3Ö‹ñ3Ï‹83ó‹Úáÿÿ‹×¯Ñ…Òt‹ÊâÿÿÁé+Ñ‹ÊÁéëº+׋xƒÀƒÀ+Ñåÿÿ÷‹ƒÀÙ‰T$‹‰\$‹Ù¯Ý…Ût‹ÓãÿÿÁê+Ú‹ËÁé+Ùë »+Ù+Ý‹L$‹|$ƒÀ3Ïáÿÿ‹8‹×¯Ñ…Òt‹ÊâÿÿÁé+Ñ‹ÊÁéëº+׋h‹ûƒÀ+Ñ3þ‹Íúçÿÿ¯Ï…Ét‹ùáÿÿÁï+Ï‹ùÁïë¹+Í‹l$+Ï‹|$Ñ3ÚƒÀ3Ö‹ñ3Ï‹83õ‹êáÿÿ‹×¯Ñ…Òt‹ÊâÿÿÁé+Ñ‹ÊÁéëº+׋xƒÀƒÀ+Ñãÿÿ÷‹ƒÀé‰T$‹‰l$‹é¯ë…ít‹ÕåÿÿÁê+ê‹ÍÁé+éë ½+é+ë‹L$‹|$ƒÀ3Ïáÿÿ‹8‹×¯Ñ…Òt‹ÊâÿÿÁé+Ñ‹ÊÁéëº+׋X‹ýƒÀ+Ñ3þ‹Ëúçÿÿ¯Ï…Ét‹ùáÿÿÁï+Ï‹ùÁïë¹+Ë‹\$+Ï‹|$Ñ3êƒÀ3Ö‹ñ3Ï‹83ó‹Úáÿÿ‹×¯Ñ…Òt‹ÊâÿÿÁé+Ñ‹ÊÁéëº+׋xƒÀƒÀ+Ñåÿÿ÷‹ƒÀÙ‰T$‹‰\$‹Ù¯Ý…Ût‹ÓãÿÿÁê+Ú‹ËÁé+Ùë »+Ù+Ý‹L$‹|$ƒÀ3Ïáÿÿ‹8‹×¯Ñ…Òt‹ÊâÿÿÁé+Ñ‹ÊÁéëº+׋h‹ûƒÀ+Ñ3þ‹Íúçÿÿ¯Ï…Ét‹ùáÿÿÁï+Ï‹ùÁïë¹+Í‹l$+Ï‹|$Ñ3ÚƒÀ3Ö‹ñ3Ï‹83õ‹êáÿÿ‹×¯Ñ…Òt‹ÊâÿÿÁé+Ñ‹ÊÁéëº+׋xƒÀƒÀý+Ñãÿÿ‹(ƒÀȯ˅Ét‹ÁáÿÿÁè+È‹ÁÁè+Èë ¹+È+Ë‹D$çÿÿÁâ úáÿÿÁå‰8 é_‰h^][Yøèƈÿÿ‹D$,SUV‹0W‹|$83É3Ò3ÛŠo‹ÅÇD$ÁáŠÁâ Ê@3ÒŠ0 Ê@3ÒŠ Ê@3Ò‰L$ŠŠXÁâ@ˆL$Áã Ó@3ÛŠ8ŠX‹ÁÁèˆD$‹ÁÁèˆD$‹ÁÁè ÓˆD$‹Â‰T$ ÁèˆD$‹ÂÁèˆD$‹ÂÁèˆD$‹D$0…ÀˆT$„ô‰D$8…öua‹L$4T$QRèWöÿÿ‹L$$ƒÄ‹Á‹ÑÁèˆD$‹ÁÁêˆT$‹T$ ÁèˆD$‹ÂÁèˆD$‹ÂÁèˆD$‹ÂÁèˆD$‹D$@ˆL$ˆT$‰D$‹D$(Š\42‹D$,ˆ@‰D$,‹D$(@F‰D$(‹D$8ƒæH‰D$8…jÿÿÿ‹D$…ÀtD‹Á‹ÙÁ舋ÅÁ눋Ù@_Áëˆ@ˆ‹Ê@Á鈋Ê@Á鈋Ê@Á鈈P‹T$8‰2^][ƒÄËD$<_‰0^][ƒÄËL$<_‰1^][ƒÄøè‡ÿÿ‹T$ ‹D$$SUV‹2…À‹D$ W„ë…À„Ä‹|$,‹\$‰D$$…ö…œo3ÉŠ‹Å3ÒŠÁáÁâ Ê@3ÒŠ0 Ê@3ÒŠ Ê@‰L$3ÉŠ3ÒŠPÁá@Áâ Ê@3ÒŠ0ŠP‹D$( ÑL$PQ‰T$èÉôÿÿ‹L$‹Å‹ÑƒÄÁꈋÑÁꈋÑ@Áêˆ@ˆ‹L$‹Ñ@ÁꈋÑ@ÁꈋÑ@ÁꈋT$0ˆHŠŠ >2Á‹L$ CˆAˆ>‹D$$F‰L$ ƒæH‰D$$…3ÿÿÿ‰2_^][ƒÄÃ…À„Ù‹|$,‹\$‰D$$…ö…œo3ÉŠ‹Å3ÒŠÁáÁâ Ê@3ÒŠ0 Ê@3ÒŠ Ê@‰L$3ÉŠ3ÒŠPÁá@Áâ Ê@3ÒŠ0ŠP‹D$( ÑL$PQ‰T$èÞóÿÿ‹L$‹Å‹ÑƒÄÁꈋÑÁꈋÑ@Áêˆ@ˆ‹L$‹Ñ@ÁꈋÑ@ÁꈋÑ@ÁꈋT$0ˆHŠŠ >ˆ>2Á‹L$ Cˆ‹D$$AFƒæH‰L$ ‰D$$…3ÿÿÿ‰2_^][ƒÄËD$‹T$3ÉSŠ(@‰ 3ÉŠU‹*V é@3ɉ*Š(@‰J‹r3ÉWŠ ñ@3ɉrŠ(r@‰‹>3ÉŠ ù@3ɉ>Š(@‰J ‹z 3ÉŠ ù@3ɉz Š(@‰J‹z3ÉŠ ù@3ɉzŠ(@‰J‹z3ÉŠ ù@3ɉzŠ(@‰J‹Z3ÉŠ Ù@3ɉZŠ‹ùÁç3ɉzŠHB Ï3Û‰J‹Î‹yü‹‹÷‹êƒæƒâÁíÁæ åÿÿƒÀ õ‰pü‹q‹îƒæÁíÁâ åÿÿƒÀ Õ‰Pü‹Q‹êƒâÁíÁæ åÿÿƒÀ õ‰pü‹q ‹îƒæÁíÁâ åÿÿƒÀ Õ‰Pü‹Q‹êƒâÁíÁæ åÿÿƒÀ õ‰pü‹q‹îƒÀÁíÁâ åÿÿ Õƒû‰Pü‹Qø};‹êƒæÁíÁæ åÿÿƒâ õƒÁ Áï‰0çÿÿÁâ ƒÀ ׉ƒÀCƒûŒÿÿÿ_^][øèVƒÿÿ‹D$ SU‹l$ÀVW‰D$ÇD$‹0…öu3ÉëG»¹ÇD$‹Ã™÷þ‹Ã‹ú+Ç™÷þ…ÿt¯Á‹Ñ‹L$‹Þ‹÷+ȉT$ëÙ…É}Á‹D$‰M‹H÷ÙƒÅáÿÿ‰M‹P÷ÚƒÅâÿÿ‰U‹p ƒÅ…öu3ÉëG»¹ÇD$‹Ã™÷þ‹Ã‹ú+Ç™÷þ…ÿt¯Á‹Ñ‹L$‹Þ‹÷+ȉT$ëÙ…É}Á‹D$‰M‹L$ƒÅƒùt'‹Pøƒè‰UƒÅ‹P‰D$‰UƒÅAƒù ‰L$Œÿþÿÿ‹L$ _^]‹A‹Q‰Q‹‘ȉA‹Ä‰‘ĉÈ[ƒÄøèöÿÿ‹D$ 3É3ÒVŠŠp@ Ê@3ÒŠÁâ Ê@3ÒŠÁâ Ê@3Ò‰L$Š@‹ò3ÒŠ03ÉŠh òŠH@‹D$$Áá Î^…À‰L$t‹T$‹D$‹L$RPT$QRè¥Nýÿë‹D$‹L$‹T$PQD$RPè´Oýÿ‹D$ ‹L$ƒÄ‹Ñˆ@ÁꈋÑ@Áêˆ@Á鈋L$@‹ÑÁêˆ@ˆ‹Ñ@ÁêÁ鈈HƒÄøèÿÿ‹L$0SU3ÀŠVq3É3í‰t$ Š.3ÒŠV ÁF3ÉÁâŠN ÂF3ÒÁá ÁF3É‹\$@ŠŠvF ÊF3ÒW‹;Šv‰D$ŠˆD$Áâ Ê‹ÐÁêˆT$‹ÐÁêˆT$‹ÐÁêˆT$‹ÑÁêˆT$‹ÑÁêˆT$‹ÑÁêˆT$‹T$0…Ò‰L$ ˆL$„܉T$0…ÿug‹D$<‹L$8‹T$4PQD$$RPèlMýÿ‹T$,‹L$0‹Ú‹ÂÁëˆ\$%ˆT$$‹ÚƒÄÁêÁëˆT$‹Ñˆ\$‹ÚÁëˆ\$‹ÚˆT$ÁëÁêˆ\$‹\$DˆT$E‹t$(ŠT<2‹t$,ˆ‹T$(FB‰T$(‹T$0G‰t$,ƒçJ‰T$0…dÿÿÿ…ít8‹T$@‹t$ˆ‹ÐÁꈋÐFÁêˆFÁèˆF‹Á‹ÑˆFÁèˆFÁêÁ鈈N‰;_^][ƒÄøèvÿÿ‹T$(‹D$,SUV‹2…À‹D$ W„ò…À„Ò‹|$4‰D$$…ö…Ÿo3ÉŠ‹Å3Ò3ÛŠ0 Ê@3ÒŠÁâ Ê@3ÒŠÁâ Ê@3Ò‰L$ŠŠx@ Ó@3ÉŠhŠ‹D$,Áá Ê‹T$0‰L$‹L$(RPT$QRèLýÿ‹L$ ‹Å‹ÑˆÁꈃċÑ@Áêˆ@Á鈋L$@‹ÑÁêˆ@ˆ‹Ñ@ÁêÁ鈋T$8ˆH‹L$Š>Š2ÃA‰L$‹L$ ˆAˆ>‹D$$F‰L$ ƒæH‰D$$…(ÿÿÿ‰2_^][ƒÄÃ…À„à‹|$4‰D$$…ö…Ÿo3ÉŠ‹Å3Ò3ÛŠ0 Ê@3ÒŠÁâ Ê@3ÒŠÁâ Ê@3Ò‰L$ŠŠx@ Ó@3ÉŠhŠ‹D$,Áá Ê‹T$0‰L$‹L$(RPT$QRèKýÿ‹L$ ‹Å‹ÑˆÁꈃċÑ@Áêˆ@Á鈋L$@‹ÑÁêˆ@ˆ‹Ñ@ÁêÁ鈋T$8ˆH‹L$ŠA‰L$Š >ˆ>2Á‹L$ ˆ‹D$$AFƒæH‰L$ ‰D$$…(ÿÿÿ‰2_^][ƒÄøèf}ÿÿ‹D$0SU‹l$4VW‹8u3À3ÉŠEŠ.‰t$ ÁF3Ò3ÉÇD$ŠŠNÁâ ÂFÁá ÁF3É3ÒŠŠvF ÊF3ҋ؈D$ŠvŠÁâÁë ʈ\$‹Ð‹ØÁèˆD$‹ÁÁèˆD$‹ÁÁèˆD$‹D$4‰L$$ˆL$ÁëÁé…À‰T$ ˆ\$ˆL$„î‹t$0‹\$,‹L$$‰D$<…ÿuc‹L$8jT$$QRèJ,ýÿ‹T$,ƒÄ ‹Â‹ÊÁèˆD$‹ÂÁéˆL$‹L$$ÁèˆD$‹ÁÁèˆD$‹ÁÁèˆD$‹ÁÁèˆD$‹D$@ˆT$ˆL$‰D$ŠD<2FCGˆFÿ‹D$<ƒçH‰D$<…{ÿÿÿ‹D$…ÀtC‹D$‹ÚÁëˆUˆ‹Ú@Áëˆ@Áêˆ@‹Ñˆ@ÁꈋÑ@ÁêÁ鈈H‹D$@‰8_^][ƒÄËL$@‰9_^][ƒÄËT$@‰:_^][ƒÄøè¶{ÿÿ‹T$ ‹D$$SUV‹2…À‹D$ W„å…À„¸‹|$,‹\$‰D$$…ö…–o3ÉŠ‹Å3ÒjŠ0 Ê@3ÒŠÁâ Ê@3ÒŠÁâ Ê@‰L$3ÉŠ@3ÒŠ0 Ê@3ÒŠpŠ‹D$,Áâ ÑL$PQ‰T$ èÛ*ýÿ‹L$‹Å‹ÑˆÁêˆƒÄ ‹Ñ@Áêˆ@Á鈋L$@‹ÑÁêˆ@ˆ‹Ñ@ÁêÁ鈋T$0ˆHŠŠ >2Á‹L$ CˆAˆ>‹D$$F‰L$ ƒæH‰D$$…9ÿÿÿ‰2_^][ƒÄÃ…À„Ó‹|$,‹\$‰D$$…ö…–o3ÉŠ‹Å3ÒjŠ0 Ê@3ÒŠÁâ Ê@3ÒŠÁâ Ê@‰L$3ÉŠ@3ÒŠ0 Ê@3ÒŠpŠ‹D$,Áâ ÑL$PQ‰T$ èö)ýÿ‹L$‹Å‹ÑˆÁêˆƒÄ ‹Ñ@Áêˆ@Á鈋L$@‹ÑÁêˆ@ˆ‹Ñ@ÁêÁ鈋T$0ˆHŠŠ >ˆ>2Á‹L$ Cˆ‹D$$AFƒæH‰L$ ‰D$$…9ÿÿÿ‰2_^][ƒÄápÓI…Àt%hÈÒIj(ÇpÓIèüÿh0ÓIj(èüÿƒÄáÕI…Àt%hxÓIj'ÇÕIèá üÿhÔIj'èÕ üÿƒÄáh×I…Àt%hÕIj&Çh×Iè± üÿh(ÖIj&è¥ üÿƒÄÃ¡ØØI…Àt%hp×Ij%ÇØØIè üÿhhØIj%èu üÿƒÄáÙI…Àt%hàØIj$ÇÙIèQ üÿhøØIj$èE üÿƒÄá˜ÚI…Àt%hÙIj#ǘÚIè! üÿhèÙIj#è üÿƒÄáxÝI…Àt%h ÚIj"ÇxÝIèñ üÿhøÛIj"èå üÿƒÄá°ßI…Àt%h€ÝIj!ǰßIèÁ üÿhHÞIj!èµ üÿƒÄá¨áI…Àt%h¸ßIj ǨáIè‘ üÿh¸àIj è… üÿƒÄáˆãI…Àt%h°áIjLjãIèa üÿhãIjèU üÿƒÄáðãI…Àt%hãIjÇðãIè1 üÿhàãIjè% üÿƒÄáåI…Àt%høãIjÇåIè üÿh˜äIjèõ üÿƒÄáàéI…Àt%h åIj ÇàéIèÑ üÿhˆçIj èÅ üÿƒÄáøëI…Àt%hèéIj ÇøëIè¡ üÿh8ëIj è• üÿƒÄáìI…Àt%hìIj ÇìIèq üÿhxìIj èe üÿƒÄáàíI…Àt%h˜ìIj ÇàíIèA üÿhXíIj è5 üÿƒÄá0îI…Àt%hèíIjÇ0îIè üÿhîIjè üÿƒÄáXîI…Àt%h8îIjÇXîIèá üÿhJjèÕ üÿƒÄáðI…Àt%h`îIjÇðIè± üÿhHïIjè¥ üÿƒÄáèðI…Àt%h˜ðIjÇèðIè üÿhÐðIjèu üÿƒÄáÈòI…Àt%hððIjÇÈòIèQ üÿhÀñIjèE üÿƒÄáôI…Àt%hÐòIjÇôIè! üÿhóIjè üÿƒÄøè¦uÿÿ‹D$ ‹L$‹T$P‹D$QRPL$0jT$QRÇD$ ÇD$èAƒÄ…ÀuƒÄËD$‹L$ V‰D$‹D$T$QRPÿT$‹ðƒÄ …öujRhDQGj jgj è¯ üÿƒÄ‹L$Qè" üÿƒÄ‹Æ^ƒÄÃSUV‹t$…öWt1‹þƒÉÿ3Àò®÷ÑI‹Á‹L$;Á~‹Á‹|$‹È‹ÑÁéó¥‹Êƒáó¤_^][Ã莋؅Ûu»äQG‹D$‹l$‹t$PSUVè~ƒÄ…Àu<‹þƒÉÿ3Àò®÷ÑIƒù}\‹ ”FjƒÁ@h°QGQÿ,F‹T$(RSUVèBƒÄ…ÀtÄjih˜QGjmjdj èÙ üÿ‹Í3À‹Ñ‹þÁéó«‹ÊƒÄƒáóª_^]ƒÈÿ[Ã_^]‹Á[ø(è&tÿÿSUVD$WL$PT$Q‹L$TD$R3ÛPQ‰\$(‰\$,‰\$$‰\$4è ‹l$\ƒÄ…À„D‹|$‹õ‹ÇŠŠÊ:u:ËtŠPŠÊ:VuƒÀƒÆ:Ëuà3ÀëÀƒØÿ;Ä4¾¸ÚF‹ÇŠŠÊ:u:ËtŠPŠÊ:VuƒÀƒÆ:Ëuà3ÀëÀƒØÿ;Ãu8¾ÜÚF‹ÅŠŠÊ:u:ËtŠPŠÊ:VuƒÀƒÆ:Ëuà3ÀëÀƒØÿ;ÄȾÐÚF‹ÇŠŠÊ:u:ËtŠPŠÊ:VuƒÀƒÆ:Ëuà3ÀëÀƒØÿ;Ãu8¾ÜÚF‹ÅŠŠÊ:u:ËtŠPŠÊ:VuƒÀƒÆ:Ëuà3ÀëÀƒØÿ;Ä\¾€ÚF‹ÇŠŠÊ:u:ËtŠPŠÊ:VuƒÀƒÆ:Ëuà3ÀëÀƒØÿ;Ãu8¾ÜÚF‹ÅŠŠÊ:u:ËtŠPŠÊ:VuƒÀƒÆ:Ëuà3ÀëÀƒØÿ;Äð¾ÚF‹ÇŠŠÊ:u:ËtŠPŠÊ:VuƒÀƒÆ:Ëuà3ÀëÀƒØÿ;Ãu8¾ÜÚF‹ÅŠŠÊ:u:ËtŠPŠÊ:VuƒÀƒÆ:Ëuà3ÀëÀƒØÿ;Ä„¾4RG‹ÇŠŠÊ:u:ËtŠPŠÊ:VuƒÀƒÆ:Ëuà3ÀëÀƒØÿ;Ãu8¾<ÚF‹ÅŠŠÊ:u:ËtŠPŠÊ:VuƒÀƒÆ:Ëuà3ÀëÀƒØÿ;ľ\ÚF‹ÇŠŠÊ:u:ËtŠPŠÊ:VuƒÀƒÆ:Ëuà3ÀëÀƒØÿ;Ãu8¾HÚF‹ÅŠŠÊ:u:ËtŠPŠÊ:VuƒÀƒÆ:Ëuà3ÀëÀƒØÿ;Ĭ¾<ÚF‹ÇŠŠÊ:u:ËtŠPŠÊ:VuƒÀƒÆ:Ëuà3ÀëÀƒØÿ;Ãu8¾ RG‹ÅŠŠÊ:u:ËtŠPŠÊ:VuƒÀƒÆ:Ëuà3ÀëÀƒØÿ;Ä@¾4RG‹ÇŠŠÊ:u:ËtŠPŠÊ:VuƒÀƒÆ:Ëuà3ÀëÀƒØÿ;Ãu8¾ RG‹ÅŠŠÊ:u:ËtŠPŠÊ:VuƒÀƒÆ:Ëuà3ÀëÀƒØÿ;ÄԾ<ÚF‹ÇŠŠÊ:u:ËtŠPŠÊ:VuƒÀƒÆ:Ëuà3ÀëÀƒØÿ;Ãu4¾°~F‹ÅŠŠÊ:u:ËtŠPŠÊ:VuƒÀƒÆ:Ëuà3ÀëÀƒØÿ;ÃtlWèÜüÿ‹D$PèÒüÿ‹L$QèÈüÿT$(D$RL$(P‹D$`T$(QRPèzƒÄ …À…¼ûÿÿèÊüÿ%ÿƒøluUhRGjèSüÿƒÄ _^]3À[ƒÄ(ËT$L$$QRèƒÄ…ÀtS‹D$T‹L$PP‹D$T$ QRL$0PQèrƒÄ…Àt.‹T$<‹D$‹L$@‰‹D$D‹T$;Ét‹L$‰;ÃÇD$ u ‹T$RèüÿƒÄ‹D$Pèöüÿ‹t$$ƒÄ;óu ‹L$QèáüÿƒÄ‹Æ_^][ƒÄ(ø¸èÆnÿÿ‹„$ÄSU‹¬$Ä‹V‹EW…À‰L$„&‹„$Ø…À…ß‹´$Ü…öt4‹þƒÉÿò®÷ÑI‹Á=~¸‹È¼$È‹ÑÁéó¥‹Êƒáó¤é¼è‹ð…öu¾äQGjV„$ÐhPèƒÄ…ÀuM‹,F¼$ȃÉÿ3Àò®÷ÑI‹Áƒø}r‹ ”FjƒÁ@h°QGQÿÓjV”$ÜhR賃ąÀt¹jih˜QGjmjdj èJüÿƒÄ¹3À¼$Èó«ë ‹Œ$Ü”$ÈQjhRÿЃÄ…À%hh˜QGjhjjj èüÿƒÄ3À_^][ĸÃL$jQj”$ÔuPRVèe‰üÿP‹EPèÛ‹L$8T$\R‰L$4èùpÿÿ‹MD$@VPjT$lQRè“tÿÿ‹D$H‹´$PL$PVQ”$€VRèwÿÿ‹L$`ƒÄLD$ÎPT$@QRèxÿÿ‹ðD$HPè>yÿÿŒ$ØhQ謣üÿT$4j Rè £üÿ‹D$0‹T$4ƒÄ Â…ö‰D$u%h¥h˜QGjejjj èüÿƒÄ3À_^][ĸËŒ$Ô‰_^]¸[ĸÃSU‹l$V‹t$W…öÇE„䊄À„Ú< „Ò‹=üFj hHRGVÿ×ƒÄ …Àth¶h˜QGjkjkj è‡üÿƒÄ3À_^][ÊF ƒÆ <4t_^]3À[ÊFF<,t_^]3À[ÃFj hüQGVÿ×ƒÄ …Àth»h˜QGjjjkj è6üÿƒÄ3À_^][Ê< t „ÀtŠFF< uô€>uh¿h˜QGjpjkj èüÿƒÄ3À_^][ÃFj hRGVÿ×ƒÄ …ÀthÂh˜QGjijkj èÏüÿƒÄ3À_^][ÃƒÆ ‹þŠ€ûA|€ûZ~€û-t €û0|€û9FëâWÆèY{üÿWè üÿƒÄ‰E…ÀˆuhÜh˜QGjrjkj èrüÿƒÄ3À_^][ËP }F‰|$…Ò~‹Ê3À‹ÙÁéó«‹Ëƒáóª,3ÿ…í~]Š<0r<9w %ÿƒè0ë"ýÿ‹èƒÄ …í`ÿÿÿëhh˜QGjAéÛÇD$ ‹t$hVÇD$èjÞüÿƒÄ…Àuhªh˜QGjA餋V‹D$ …ÀÆ…0‹œ$D$,hþPSèù=ýÿ‹èƒÄ …íŽë‹t$…í| €|,, MyöEÆD,, EƒýAÆD,,tÇD$$j L$0hTRGQÿüFƒÄ …À„ÒƒýAÉ‹T$D* PVèjÞüÿƒÄ…Àt_‹D$‹T$‹Ít$,‹xú‹ÑÁéó¥‹Êƒáó¤‹@‹L$ÅÆ‹L$‹D$$Í…À‰L$u0T$,hþRSè3=ýÿ‹èƒÄ …í<ÿÿÿëTh¼h˜QGjAé•D$,hþPSÆD$8èþ<ýÿƒÄ …À~'€|, Hyö@ÆD, ÆD-ë‹D$‰t$‰D$‰\$‹\$ƒÉÿ3Àj ‹{hTRGò®‹=üF÷ÑI‹ñL$4Qÿ×ƒÄ …À…‹CT$5VRPÿ×ƒÄ …À…ýjL49h`RGQÿ×ƒÄ …À…ä”$,RèA ‹t$‹L$QT$‹FPRP„$@PèA ƒÄ…À}håh˜QGjdé«‹V‹\$L$(ÓQ„$0RPèMƒÄ …À}hëh˜QGjdëz‹L$‹D$(ȉL$tv‹D$‹´$”‹¼$˜‹œ$œ‹PP‰‹t$‹V‰‹|$‹W‰‹”$¤‰ è9üÿVè3üÿWè-üÿƒÄ ¸_^][Ä|ÃhÛh˜QGjfjmj è…ûûÿƒÄ‹D$PèXÛüÿ‹L$QèNÛüÿ‹T$ RèDÛüÿƒÄ 3À_^][Ä|Ãhmh˜QGjAjmj è?ûûÿƒÄ3À_^][Ä|Ã|$u‹D$VjO‹0èëküÿƒÄ‰¸^øËL$ ‹T$V‹t$j‹FPQRèÆýÿP‹PèƒÄ^øìRGøSGøSGø,SGËD$‹L$ ‹T$P‹D$QRPh RGh0îAè-îÿÿƒÄÃjEhüÿƒÄ…Àt$3ÛÇD$(ëhàhTSGj jtj è õûÿƒÄ…Ût SèûÿÿƒÄ‹D$(…ÀuA‹|$W3öè™?üÿƒÄ…À~VWè›?üÿPèÕúÿÿWFè~?üÿƒÄ;ð|å;|$Lt Wè;?üÿƒÄ3öë‹t$‹D$…Àt Pè" üÿƒÄ‹D$…Àt Pè üÿƒÄ‹D$…Àt Pè üÿƒÄ‹Æ_^][ƒÄ4ÃS‹\$UV…ÛWu_^]3À[Ët$ƒþu‹D$PSè©•üÿƒÄ_^][Ë;VWjè6üÿ‹l$$ƒÄ …í‰D$tU‹Mƒþ‰L$t ƒþt3À븋T$ RVWPD$$Pèë4üÿ‹ ‹s‹|$(‹ÑÁéó¥‹ÊƒÄƒáó¤‹D$‹ Á‰E‹D$_^][àJöØÀ%Jøè&]ÿÿSU‹¬$V…íWu J„Àt½Jè ‹œ$‹ðû¸ÿ}‹Ã‹¼$PjWjUVèØ ‹„$8ƒÄ…Àt$û¸ÿ}‹ÃWPD$jPjUVèÉ ƒÄVèà V‹øè L$hQèi“üÿƒÄ‹Ç_^][Äø8èf\ÿÿ‹D$衎üÿ;ljFu_3À^Ãjèž/üÿƒÄ;ljFu_3À^ÃN 3À‰~ ‰~‰~‰~‰~‰_‰A‰A‰A ÇF0‹Æ^ÃV‹t$…ötnh…h TGjF0jÿPèÀ@üÿƒÄ…ÀP‹F…Àt Pè,ŽüÿƒÄ‹F…Àt Pèl/üÿƒÄ‹F …Àt Pè\üÿƒÄ‹F…Àt‹N…Ét PèÿûÿƒÄVèüþûÿƒÄ^ÃVjPh$TGjèaüûÿ‹ðƒÄ …öujSh$TGjAjhj(èFêûÿƒÄ3À^á`J…Àu èá£`J‰F PVj ÇFÇFèÀÆüÿƒÄ ‹Æ^ÃV‹t$…öt#‹FhPîEPè4üÿN QVj èýÆüÿVèWþûÿƒÄ^ÃV‹t$öFt1‹FPè<þûÿ‹ƒÄƒøu‹NQè)þûÿ‹VRè þûÿ‹FPèþûÿƒÄ VèþûÿƒÄ^ÃS‹\$ VƒÎÿ…ÛWuh’h$TGjCjmj(è]éûÿƒÄ‹Æ_^[Ë|$…ÿuh—h$TGjijmj(è7éûÿƒÄ‹Æ_^[Ãh™h$TGj èûûÿ‹ðƒÄ …ö„œ‹D$‰~ ‹|$‰^ÇF‰FÇ‹G…Àu è†/üÿ…À‰Gt+‹L$ ‹T$$‰N‰VÇF‹GVPè€2üÿƒÄ…ÀH_^H[ÃöFt1‹NQè%ýûÿ‹ƒÄƒøu‹VRèýûÿ‹FPè ýûÿ‹NQèýûÿƒÄ Vè÷üûÿƒÄƒÈÿ_^[ÃS‹\$ UƒÍÿVW…Ûuh’h$TGjCjmj(è<èûÿƒÄ‹Å_^][Ë|$ …ÿuh—h$TGjijmj(èèûÿƒÄ‹Å_^][Ãh™h$TGj èúùûÿ‹ðƒÄ …ö„‹D$‰~ ‹|$‰^ÇF‰FÇ‹G…Àu èc.üÿ…À‰Gt,‹L$$‹T$(‹D$,‰N‰V‰F‹OVQè]1üÿƒÄ…ÀH_^]H[ÃöFt1‹VRèüûÿ‹ƒÄƒøu‹FPèîûûÿ‹NQèåûûÿ‹VRèÜûûÿƒÄ VèÓûûÿƒÄ‹Å_^][ÃUV‹t$ 3í‹‹@…ÀtVÿЃÄ…Àu^ƒÈÿ]ËFöÄtVhðñEèœLþÿƒÄ‹NSWQ3Ûè¬1üÿƒÄ…À~0‹>‹G…Àt‹VSRè¢1üÿPVÿWƒÄ…Àtv‹FCPè|1üÿƒÄ;Ø|Ћ‹A …ÀtVÿЃÄƒøÿtV…ÀtM3í‹V3ÛRèP1üÿƒÄ…À~C‹>‹G…Àt‹FSPèF1üÿPVÿWƒÄƒøÿt…Àt3í‹NCQè1üÿƒÄ;Ø|Éë ƒÍÿë½þÿÿÿ‹_[‹B…ÀtVÿЃÄ…Àu^ƒÈÿ]ËÅ^]ø è¦OÿÿW¹3À|$ó«‹L$0‹D$(ÇD$‰D$‹_‹B…ÀtT$RQÿЃÄ…ÀuƒÈÿƒÄ Ã3ÀƒÄ ËD$…ÀuË@ËD$…ÀuË@ËL$…Éu3ÀËHtƒèt3ÀËAËL$…Ét‹…À~ ƒø‹A Ã3ÀËL$…Éu3À˃èt3ÀËAø èÆNÿÿSU‹l$4VW‹ýƒÉÿ3Àò®‹|$4‹t$8÷ÑI‹Ù‹Oƒáþ…ö‰Ot;‹…ÀޝƒøŽ¥ƒø…‹F …Àu#hlh$TGjijij(èãäûÿƒÄ_^]ƒÈÿ[ƒÄ ÃÆŠE„À‹ý„c‹˜F¾‹NPQÿӃąÀu#¾‹FRPÿӃąÀu&ŠGG„ÀuÖ_^]3À[ƒÄ ËN‹V _^Š]ˆ3À[ƒÄ ËN‹V _^Š]ˆ3À[ƒÄ ËNT$ Qh˜ÊHj RèÎTüÿ‹FL$ Ph˜ÊHj Qè¹Tüÿ‹FƒÄ ;Ø}L‹ohOh$TGjeƒÍjij(‰oèäûÿT$$hXTGRD$™A€‡cAjø@KGS!@#$%ðÍApÎAÀÎA`ÏAÐA ÐA0ÑApÑA0ÒAðÒA0ÔAinternal errorpassed a null parametercalled a function you should not callmalloc failurefatalmissing asn1 eosasn1 length mismatchexpecting an asn1 sequencebad get asn1 object callbad asn1 object headernested asn1 errorOCSP libENGINE libDSO libRAND libPKCS12 libX509V3 libPKCS7 libBIO libSSL libEC libCRYPTO libCONF libASN1 libX509 libDSA libPEM libOBJ libBUF libEVP libDH libRSA libBN libsystem libfreadopendirWSAstartupacceptlistenbindioctlsocketsocketgetservbynameconnectfopenOCSP routinesengine routinesDSO support routinesrandom number generatorPKCS12 routinesX509 V3 routinesPKCS7 routinesBIO routinesSSL routineselliptic curve routinescommon libcrypto routinesconfiguration file routinesasn1 encoding routinesx509 certificate routinesdsa routinesPEM routinesobject identifier routinesmemory buffer routinesdigital envelope routinesDiffie-Hellman routinesrsa routinesbignum routinessystem libraryunknown library.\crypto\err\err.cint_err_get (err.c)int_thread_get (err.c)NAerror:%08lX:%s:%s:%sreason(%lu)func(%lu)lib(%lu)OpenSSL 0.9.7c 30 Sep 2003.\crypto\x509\x509_cmp.c‘DÒHðxBè FðxBÜ Fp{B Ô F^BÈ F`{BÀ F^BtÔH0mB‰´ FpyB‰ ¨ FpyB•$œ FàxBF ( FðìA„ FàìA| Fp{BÜ FpyB F FTt FX509sig_algcert_infoX509_CINFextensionssubjectUIDissuerUIDsubjectvalidityissuersignatureserialNumber.\crypto\x509\x509_obj.cNO X509_NAME.rndC:RANDFILEModule32NextModule32FirstThread32NextThread32FirstProcess32NextProcess32FirstHeap32ListNextHeap32ListFirstHeap32NextHeap32FirstCloseToolhelp32SnapshotCreateToolhelp32SnapshotGetQueueStatusGetCursorInfoGetForegroundWindowIntel Hardware Cryptographic Service ProviderCryptReleaseContextCryptGenRandomCryptAcquireContextALanmanServerLanmanWorkstationNetApiBufferFreeNetStatisticsGetNETAPI32.DLLUSER32.DLLKERNEL32.DLLADVAPI32.DLL.\crypto\rand\rand_win.cDISPLAYÿÿÿÿšûA ûA.\crypto\evp\p_lib.cX.509 part of OpenSSL 0.9.7c 30 Sep 2003.\crypto\x509\x509_vfy.cname=„F@zB|F€zBè FpF‰`F0{B‰TF0{B0 FDFˆ8F°Bˆ(F`zBˆF`zBˆ FzBüF^BˆìFÀBˆÐF`zBˆÄFÀyBˆ´F@zBx F ¤F”FÐBÿÿÿÿPF„FGENERAL_NAMESGeneralNamesGENERAL_NAMEd.registeredIDd.iPAddressd.uniformResourceIdentifierd.ediPartyNamed.directoryNamed.x400Addressd.dNSNamed.rfc822Named.otherNameEDIPARTYNAMEpartyNamenameAssignerOTHERNAMEvaluetype_idASN.1 part of OpenSSL 0.9.7c 30 Sep 2003.\crypto\asn1\asn1_lib.caddress= offset=%luStack part of OpenSSL 0.9.7c 30 Sep 2003.\crypto\stack\stack.cMD5 part of OpenSSL 0.9.7c 30 Sep 2003€DES part of OpenSSL 0.9.7c 30 Sep 2003libdes part of OpenSSL 0.9.7c 30 Sep 2003€@€@@€€@€€@€@€@@€@@€€@€@€€@@@€€@€@€@€€@@@€@€@€€@€@€@€@€@@€€@€@@€@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@                            @€@ €@ @ € @ @ € € €@€ €@ @ €@ € @ €@ €@ € €€@ @ @ €@ € €@ €@ €€ @ € @ @ € @@ € @ €@€ €@ @€@ € € €@ @@ €@B@B@B@@@BB@BBB@B@@@@BBB@BB@BB@@€€ ‚ € €€€ €‚ € ‚€€‚€ € € €‚€€ €‚ € ‚ €€ €€ €‚ €€€ €‚ € ‚€€ €  €€‚ €€€ €‚ €€ € ‚€€ € €‚ €‚ €€ €‚  ##%%&&))**,,//1122447788;;==>>@@CCEEFFIIJJLLOOQQRRTTWWXX[[]]^^aabbddgghhkkmmnnppssuuvvyyzz||€€ƒƒ……††‰‰ŠŠŒŒ‘‘’’””——˜˜››žž¡¡¢¢¤¤§§¨¨««­­®®°°³³µµ¶¶¹¹ºº¼¼¿¿ÁÁÂÂÄÄÇÇÈÈËËÍÍÎÎÐÐÓÓÕÕÖÖÙÙÚÚÜÜßßààããååææééêêììïïññòòôô÷÷øøûûýýþþ        0 0 0  0 0  0 0  0           0  0 0 0 0  0  0  0          $$  $ $ $$  $ $             $$  $ $ $$  $ $                  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0                            ((  ((  ((  ((  ((  ((  ((  ((          """"   " " " " ((((((((    """" ( ( ( ("("("("(hwcrhkuidynlockdsodebug_malloc2dhRSA_blindingreaddirgethostbynameBIOdebug_mallocrand2randssl_methodsslssl_sess_certssl_sessionssl_certssl_ctxx509_storeevp_pkeyrsadsax509_reqx509_crlx509_pkeyx509_infox509ex_dataerr<>.\crypto\cryptlib.c%s(%d): OpenSSL internal error, assertion failed: %s pointer != NULL.\crypto\mem_dbg.clhash part of OpenSSL 0.9.7c 30 Sep 2003.\crypto\lhash\lhash.cdoapr().\crypto\bio\b_print.c0123456789abcdefà?$@0123456789ABCDEF0xMicrosoft Universal Principal NamemsUPNMicrosoft SmartcardloginmsSmartcardLoginrsaOAEPEncryptionSETdes-cdmfDES-CDMFset-brand-Novusset-brand-MasterCardset-brand-Visaset-brand-JCBset-brand-AmericanExpressset-brand-Dinersset-brand-IATA-ATAsecure device signaturesetAttr-SecDevSigICC or token signaturesetAttr-TokICCsigcleartext track 2setAttr-T2cleartxtencrypted track 2setAttr-T2Encgenerate cryptogramsetAttr-GenCryptgrmsetAttr-IssCap-SigsetAttr-IssCap-T2setAttr-IssCap-CVMsetAttr-Token-B0PrimesetAttr-Token-EMVset-addPolicyset-rootKeyThumbissuer capabilitiessetAttr-IssCapsetAttr-TokenTypepayment gateway capabilitiessetAttr-PGWYcapsetAttr-CertsetCext-IssuerCapabilitiessetCext-TokenTypesetCext-Track2DatasetCext-TokenIdentifiersetCext-PGWYcapabilitiessetCext-setQualfsetCext-setExtsetCext-tunnelingsetCext-cCertRequiredsetCext-merchDatasetCext-certTypesetCext-hashedRootset-policy-rootadditional verificationsetext-cvsetext-track2setext-pinAnysetext-pinSecuremerchant initiated authsetext-miAuthgeneric cryptogramsetext-genCryptsetct-BCIDistributionTBSsetct-CRLNotificationResTBSsetct-CRLNotificationTBSsetct-CertResTBEsetct-CertReqTBEXsetct-CertReqTBEsetct-RegFormReqTBEsetct-BatchAdminResTBEsetct-BatchAdminReqTBEsetct-CredRevResTBEsetct-CredRevReqTBEXsetct-CredRevReqTBEsetct-CredResTBEsetct-CredReqTBEXsetct-CredReqTBEsetct-CapRevResTBEsetct-CapRevReqTBEXsetct-CapRevReqTBEsetct-CapResTBEsetct-CapReqTBEXsetct-CapReqTBEsetct-AuthRevResTBEBsetct-AuthRevResTBEsetct-AuthRevReqTBEsetct-AcqCardCodeMsgTBEsetct-CapTokenTBEXsetct-CapTokenTBEsetct-AuthTokenTBEsetct-AuthResTBEXsetct-AuthResTBEsetct-AuthReqTBEsetct-PIUnsignedTBEsetct-PIDualSignedTBEsetct-ErrorTBSsetct-CertInqReqTBSsetct-CertResDatasetct-CertReqTBSsetct-CertReqDatasetct-RegFormResTBSsetct-MeAqCInitResTBSsetct-CardCInitResTBSsetct-BatchAdminResDatasetct-BatchAdminReqDatasetct-PCertResTBSsetct-PCertReqDatasetct-CredRevResDatasetct-CredRevReqTBSXsetct-CredRevReqTBSsetct-CredResDatasetct-CredReqTBSXsetct-CredReqTBSsetct-CapRevResDatasetct-CapRevReqTBSXsetct-CapRevReqTBSsetct-CapResDatasetct-CapReqTBSXsetct-CapReqTBSsetct-AuthRevResTBSsetct-AuthRevResDatasetct-AuthRevReqTBSsetct-AcqCardCodeMsgsetct-CapTokenTBSsetct-CapTokenDatasetct-AuthTokenTBSsetct-AuthResTBSXsetct-AuthResTBSsetct-AuthReqTBSsetct-PResDatasetct-PI-TBSsetct-PInitResDatasetct-CapTokenSeqsetct-AuthRevResBaggagesetct-AuthRevReqBaggagesetct-AuthResBaggagesetct-HODInputsetct-PIDataUnsignedsetct-PIDatasetct-PIsetct-OIDatasetct-PANOnlysetct-PANTokensetct-PANDataset-brandcertificate extensionsset-certExtset-policyset-attrmessage extensionsset-msgExtcontent typesset-ctypeSecure Electronic Transactionsid-setpseudonymgenerationQualifierid-hex-multipart-messageid-hex-partial-messagemime-mhs-bodiesmime-mhs-headingsMIME MHSmime-mhsx500UniqueIdentifierdocumentPublisheraudiodITRedirectpersonalSignaturesubtreeMaximumQualitysubtreeMinimumQualitysingleLevelQualitydSAQualitybuildingNamemailPreferenceOptionjanetMailboxorganizationalStatusfriendlyCountryNamepagerTelephoneNumbermobileTelephoneNumberpersonalTitlehomePostalAddressassociatedNameassociatedDomaincNAMERecordsOARecordnSRecordmXRecordpilotAttributeType27aRecordlastModifiedBylastModifiedTimeotherMailboxsecretaryhomeTelephoneNumberdocumentLocationdocumentAuthordocumentVersiondocumentTitledocumentIdentifiermanageruserClassphotoroomNumberfavouriteDrinkinforfc822MailboxmailtextEncodedORAddressuserIdUIDqualityLabelledDatapilotDSApilotOrganizationsimpleSecurityObjectfriendlyCountrydomainRelatedObjectdNSDomainrFC822localPartdocumentSeriesroomdocumentaccountpilotPersonpilotObjectcaseIgnoreIA5StringSyntaxiA5StringSyntaxpilotGroupspilotObjectClasspilotAttributeSyntaxpilotAttributeTypepilotuclpssHold Instruction RejectholdInstructionRejectHold Instruction Call IssuerholdInstructionCallIssuerHold Instruction NoneholdInstructionNoneHold Instruction CodeholdInstructionCodeaes-256-cfbAES-256-CFBaes-256-ofbAES-256-OFBaes-256-cbcAES-256-CBCaes-256-ecbAES-256-ECBaes-192-cfbAES-192-CFBaes-192-ofbAES-192-OFBaes-192-cbcAES-192-CBCaes-192-ecbAES-192-ECBaes-128-cfbAES-128-CFBaes-128-ofbAES-128-OFBaes-128-cbcAES-128-CBCaes-128-ecbAES-128-ECBMicrosoft CSP NameCSPNameecdsa-with-SHA1prime256v1prime239v3prime239v2prime239v1prime192v3prime192v2prime192v1id-ecPublicKeycharacteristic-two-fieldprime-fieldANSI X9.62ansi-X9-62ccittCCITTX509v3 No Revocation AvailablenoRevAvailX509v3 AC TargetingtargetInformationX509v3 Policy ConstraintspolicyConstraintsroleid-aca-encAttrsSubject Information AccesssubjectInfoAccessac-proxyingmd4WithRSAEncryptionRSA-MD4clearanceSelected Attribute Typesselected-attribute-typesjoint-iso-ccittJOINT-ISO-CCITTDomaindomainComponentDCdcObjectdcobjectEnterprisesenterprisesMailSNMPv2snmpv2SecuritysecurityPrivateprivateExperimentalexperimentalManagementmgmtDirectorydirectoryianaIANAdodDODORGdirectory services - algorithmsX500algorithmsrsaSignatureTrust RoottrustRootvalidExtended OCSP StatusextendedStatusOCSP Service LocatorserviceLocatorOCSP Archive CutoffarchiveCutoffOCSP No ChecknoCheckAcceptable OCSP ResponsesacceptableResponsesOCSP CRL IDCrlIDOCSP NonceNonceBasic OCSP ResponsebasicOCSPResponsead dvcsAD_DVCSAD Time Stampingad_timestampingid-cct-PKIResponseid-cct-PKIDataid-cct-crsid-qcs-pkixQCSyntax-v1id-aca-roleid-aca-groupid-aca-chargingIdentityid-aca-accessIdentityid-aca-authenticationInfoid-pda-countryOfResidenceid-pda-countryOfCitizenshipid-pda-genderid-pda-placeOfBirthid-pda-dateOfBirthid-on-personalDataid-cmc-confirmCertAcceptanceid-cmc-popLinkWitnessid-cmc-popLinkRandomid-cmc-queryPendingid-cmc-responseInfoid-cmc-regInfoid-cmc-revokeRequestid-cmc-getCRLid-cmc-getCertid-cmc-lraPOPWitnessid-cmc-decryptedPOPid-cmc-encryptedPOPid-cmc-addExtensionsid-cmc-recipientNonceid-cmc-senderNonceid-cmc-transactionIdid-cmc-dataReturnid-cmc-identityProofid-cmc-identificationid-cmc-statusInfoid-alg-dh-popid-alg-dh-sig-hmac-sha1id-alg-noSignatureid-alg-des40id-regInfo-certReqid-regInfo-utf8Pairsid-regCtrl-protocolEncrKeyid-regCtrl-oldCertIDid-regCtrl-pkiArchiveOptionsid-regCtrl-pkiPublicationInfoid-regCtrl-authenticatorid-regCtrl-regTokenid-regInfoid-regCtrlid-it-origPKIMessageid-it-confirmWaitTimeid-it-implicitConfirmid-it-revPassphraseid-it-keyPairParamRepid-it-keyPairParamReqid-it-subscriptionResponseid-it-subscriptionRequestid-it-unsupportedOIDsid-it-currentCRLid-it-caKeyUpdateInfoid-it-preferredSymmAlgid-it-encKeyPairTypesid-it-signKeyPairTypesid-it-caProtEncCertdvcsDVCSIPSec UseripsecUserIPSec TunnelipsecTunnelIPSec End SystemipsecEndSystemtextNoticesbqp-routerIdentifiersbqp-autonomousSysNumsbqp-ipAddrBlockaaControlsac-targetingac-auditEntityqcStatementsBiometric InfobiometricInfoid-mod-cmp2000id-mod-dvcsid-mod-ocspid-mod-timestamp-protocolid-mod-attribute-certid-mod-qualified-cert-93id-mod-qualified-cert-88id-mod-cmpid-mod-kea-profile-93id-mod-kea-profile-88id-mod-cmcid-mod-crmfid-pkix1-implicit-93id-pkix1-explicit-93id-pkix1-implicit-88id-pkix1-explicit-88id-cctid-qcsid-acaid-pdaid-onid-cmcid-algid-pkipid-itid-qtid-pkix-modmd4MD4id-smime-cti-ets-proofOfCreationid-smime-cti-ets-proofOfApprovalid-smime-cti-ets-proofOfSenderid-smime-cti-ets-proofOfDeliveryid-smime-cti-ets-proofOfReceiptid-smime-cti-ets-proofOfOriginid-smime-spq-ets-sqt-unoticeid-smime-spq-ets-sqt-uriid-smime-cd-ldapid-smime-alg-CMSRC2wrapid-smime-alg-CMS3DESwrapid-smime-alg-ESDHid-smime-alg-RC2wrapid-smime-alg-3DESwrapid-smime-alg-ESDHwithRC2id-smime-alg-ESDHwith3DESid-smime-aa-dvcs-dvcid-smime-aa-signatureTypeid-smime-aa-ets-archiveTimeStampid-smime-aa-ets-certCRLTimestampid-smime-aa-ets-escTimeStampid-smime-aa-ets-revocationValuesid-smime-aa-ets-certValuesid-smime-aa-ets-RevocationRefsid-smime-aa-ets-CertificateRefsid-smime-aa-ets-contentTimestampid-smime-aa-ets-otherSigCertid-smime-aa-ets-signerAttrid-smime-aa-ets-signerLocationid-smime-aa-ets-commitmentTypeid-smime-aa-ets-sigPolicyIdid-smime-aa-timeStampTokenid-smime-aa-smimeEncryptCertsid-smime-aa-signingCertificateid-smime-aa-encrypKeyPrefid-smime-aa-contentReferenceid-smime-aa-equivalentLabelsid-smime-aa-macValueid-smime-aa-contentIdentifierid-smime-aa-encapContentTypeid-smime-aa-msgSigDigestid-smime-aa-contentHintid-smime-aa-mlExpandHistoryid-smime-aa-securityLabelid-smime-aa-receiptRequestid-smime-ct-DVCSResponseDataid-smime-ct-DVCSRequestDataid-smime-ct-contentInfoid-smime-ct-TDTInfoid-smime-ct-TSTInfoid-smime-ct-publishCertid-smime-ct-authDataid-smime-ct-receiptid-smime-mod-ets-eSigPolicy-97id-smime-mod-ets-eSigPolicy-88id-smime-mod-ets-eSignature-97id-smime-mod-ets-eSignature-88id-smime-mod-msg-v3id-smime-mod-oidid-smime-mod-essid-smime-mod-cmsid-smime-ctiid-smime-spqid-smime-cdid-smime-algid-smime-aaid-smime-ctid-smime-modS/MIMESMIMEpkcs5pkcs1X9.57 CM ?X9cmX9.57X9-57ISO US Member BodyISO-USISO Member Bodymember-bodyisoISOOCSP SigningOCSPSigningCA IssuerscaIssuersOCSPAuthority Information AccessauthorityInfoAccessid-adid-pednQualifiernameExtension RequestextReqMicrosoft Extension RequestmsExtReqpbeWithSHA1AndDES-CBCPBE-SHA1-DESpbeWithMD5AndRC2-CBCPBE-MD5-RC2-64pbeWithMD2AndRC2-CBCPBE-MD2-RC2-64S/MIME CapabilitiesSMIME-CAPSrc2-64-cbcRC2-64-CBCPolicy Qualifier User Noticeid-qt-unoticePolicy Qualifier CPSid-qt-cpshmacWithSHA1PBMAC1PBES2x509CrlsdsiCertificatex509CertificatelocalKeyIDfriendlyNamesafeContentsBagsecretBagcrlBagcertBagpkcs8ShroudedKeyBagkeyBagpbeWithSHA1And40BitRC2-CBCPBE-SHA1-RC2-40pbeWithSHA1And128BitRC2-CBCPBE-SHA1-RC2-128pbeWithSHA1And2-KeyTripleDES-CBCPBE-SHA1-2DESpbeWithSHA1And3-KeyTripleDES-CBCPBE-SHA1-3DESpbeWithSHA1And40BitRC4PBE-SHA1-RC4-40pbeWithSHA1And128BitRC4PBE-SHA1-RC4-128Strong Extranet IDSXNetIDInvalidity DateinvalidityDateX509v3 CRL Reason CodeCRLReasonX509v3 Delta CRL IndicatordeltaCRLNetscape Server Gated CryptonsSGCMicrosoft Encrypted File SystemmsEFSMicrosoft Server Gated CryptomsSGCMicrosoft Trust List SigningmsCTLSignMicrosoft Commercial Code SigningmsCodeComMicrosoft Individual Code SigningmsCodeIndTime StampingtimeStampingE-mail ProtectionemailProtectionCode SigningcodeSigningTLS Web Client AuthenticationclientAuthTLS Web Server AuthenticationserverAuthid-kpPKIXX509v3 Extended Key UsageextendedKeyUsagezlib compressionZLIBrun length compressionRLErc5-ofbRC5-OFBrc5-cfbRC5-CFBrc5-ecbRC5-ECBrc5-cbcRC5-CBCripemd160WithRSARSA-RIPEMD160ripemd160RIPEMD160dsaEncryptionDSAsha1WithRSARSA-SHA1-2md5-sha1MD5-SHA1dsaWithSHA1DSA-SHA1pbeWithMD5AndCast5CBCcast5-ofbCAST5-OFBcast5-cfbCAST5-CFBcast5-ecbCAST5-ECBcast5-cbcCAST5-CBCdescriptiontitlemd5WithRSARSA-NP-MD5X509v3 CRL Distribution PointscrlDistributionPointsinitialssurnameSNgivenNameGNrc2-40-cbcRC2-40-CBCrc4-40RC4-40mdc2WithRSARSA-MDC2mdc2MDC2bf-ofbBF-OFBbf-cfbBF-CFBbf-ecbBF-ECBbf-cbcBF-CBCX509v3 Authority Key IdentifierauthorityKeyIdentifierX509v3 Certificate PoliciescertificatePoliciesX509v3 CRL NumbercrlNumberX509v3 Basic ConstraintsbasicConstraintsX509v3 Issuer Alternative NameissuerAltNameX509v3 Subject Alternative NamesubjectAltNameX509v3 Private Key Usage PeriodprivateKeyUsagePeriodX509v3 Key UsagekeyUsageX509v3 Subject Key IdentifiersubjectKeyIdentifierid-cedesx-cbcDESX-CBCNetscape Certificate SequencensCertSequenceNetscape CommentnsCommentNetscape SSL Server NamensSslServerNameNetscape CA Policy UrlnsCaPolicyUrlNetscape Renewal UrlnsRenewalUrlNetscape CA Revocation UrlnsCaRevocationUrlNetscape Revocation UrlnsRevocationUrlNetscape Base UrlnsBaseUrlNetscape Cert TypensCertTypedsaWithSHA1-oldDSA-SHA1-oldPBKDF2pbeWithSHA1AndRC2-CBCPBE-SHA1-RC2-64dsaEncryption-oldDSA-olddsaWithSHADSA-SHAsha1WithRSAEncryptionRSA-SHA1sha1SHA1des-ede3-ofbDES-EDE3-OFBdes-ede-ofbDES-EDE-OFBdes-ede3-cfbDES-EDE3-CFBdes-ede-cfbDES-EDE-CFBNetscape Data TypensDataTypeNetscape Certificate ExtensionnsCertExtNetscape Communications Corp.NetscapeextendedCertificateAttributesunstructuredAddresschallengePasswordcountersignaturesigningTimemessageDigestcontentTypeunstructuredNameemailAddresspkcs9idea-ofbIDEA-OFBdes-ofbDES-OFBdes-ede3-cbcDES-EDE3-CBCdes-ede-cbcDES-EDE-CBCshaWithRSAEncryptionRSA-SHAshaSHArc2-ofbRC2-OFBrc2-cfbRC2-CFBrc2-ecbRC2-ECBrc2-cbcRC2-CBCidea-ecbIDEA-ECBidea-cfbIDEA-CFBidea-cbcIDEA-CBCdes-ede3DES-EDE3des-edeDES-EDEdes-cbcDES-CBCdes-cfbDES-CFBdes-ecbDES-ECBdhKeyAgreementpkcs3pkcs7-encryptedDatapkcs7-digestDatapkcs7-signedAndEnvelopedDatapkcs7-envelopedDatapkcs7-signedDatapkcs7-datapkcs7RSAorganizationalUnitNameOUorganizationNamestateOrProvinceNameSTlocalityNamecountryNamecommonNameCNdirectory services (X.500)X500pbeWithMD5AndDES-CBCPBE-MD5-DESpbeWithMD2AndDES-CBCPBE-MD2-DESmd5WithRSAEncryptionRSA-MD5md2WithRSAEncryptionRSA-MD2rsaEncryptionrc4RC4md5MD5md2MD2RSA Data Security, Inc. PKCSpkcsRSA Data Security, Inc.rsadsiundefinedUNDEF.\crypto\objects\obj_dat.c.%lu%d.%lu.\crypto\objects\o_names.cTYPE=NULL.\crypto\evp\evp_pbe.c.\crypto\evp\digest.cctx->digest->md_size <= EVP_MAX_MD_SIZEP]Bp]B]BÐ"Cà$C@`€_F@zB|F{B@^Fp_Fh_FÀ]Bÿÿÿÿˆ^FT_FL_Fð]BÿÿÿÿÀ^F8_F^B_BP_B@aBø^F,_FX509_NAMEX509_NAME_INTERNALNameX509_NAME_ENTRIESRDNSX509_NAME_ENTRYobject.\crypto\asn1\x_name.cocsphelperOCSP helperanyAny PurposecrlsignCRL signingsmimeencryptS/MIME encryptionsmimesignS/MIME signingnssslserverNetscape SSL serversslserverSSL serversslclientSSL client.\crypto\x509v3\v3_purp.cmBü`Fp{Bð`FpyB `Fˆ`F ä`FX509_PUBKEYpublic_keyalgor.\crypto\asn1\x_pubkey.cBig Number part of OpenSSL 0.9.7c 30 Sep 2003.\crypto\bn\bn_lib.c€_F@zBÔbF@{B|FÀyBhbF ÄbFX509_EXTENSIONcritical`gF PgF@gF,gF gFgF gFìfFÜfFÌfF¸fF¨fFfF|fFdfFTfFüÿÿÿHfF8fF=(fFP(fF) fFÿÿÿÿüeFìeFÜeFASN1_FBOOLEANASN1_TBOOLEANASN1_BOOLEANDIRECTORYSTRINGDISPLAYTEXTASN1_PRINTABLEASN1_SEQUENCEASN1_ANYASN1_BMPSTRINGASN1_UNIVERSALSTRINGASN1_VISIBLESTRINGASN1_GENERALIZEDTIMEASN1_UTCTIMEASN1_GENERALSTRINGASN1_IA5STRINGASN1_T61STRINGASN1_PRINTABLESTRINGASN1_UTF8STRINGASN1_OBJECTASN1_NULLASN1_OCTET_STRINGASN1_BIT_STRINGASN1_ENUMERATEDASN1_INTEGERÌgFàØBÀgFàØBpgF´gFX509_VALnotAfternotBefore”I@zB(hF€zBØgFhFX509_ALGORparameterType=Field=, Type=.\crypto\asn1\tasn_dec.c.\crypto\asn1\tasn_enc.c.\crypto\asn1\tasn_new.c.\crypto\ex_data.c‰,iFÀyBÔ FÐB‰$iFðxB¸hF iFAUTHORITY_KEYIDserialkeyidäiF@zBÜiF@zBÔiFPzB ,iFÀyBÌiFp{B8iF¼iFX509_CERT_AUXotheraliasrejecttrust.\crypto\asn1\a_dup.c.\crypto\buffer\buffer.c.\crypto\asn1\a_object.c@A ]E@]E`¿BÐ"Cà$C@d.\crypto\engine\eng_init.cRAND part of OpenSSL 0.9.7c 30 Sep 2003@@.\crypto\rand\md_rand.cYou need to read the OpenSSL FAQ, http://www.openssl.org/support/faq.html....................DSA part of OpenSSL 0.9.7c 30 Sep 2003.\crypto\dsa\dsa_lib.cRSA part of OpenSSL 0.9.7c 30 Sep 2003.\crypto\rsa\rsa_lib.cDiffie-Hellman part of OpenSSL 0.9.7c 30 Sep 2003.\crypto\dh\dh_lib.cOCSP requestOCSP responderObject SignerS/MIME emailSSL ServerSSL ClientcompatibleÀ¤lFASN1_TIME.\crypto\asn1\a_time.c%04d%02d%02d%02d%02d%02dZ.\crypto\asn1\a_gentm.c%02d%02d%02d%02d%02d%02dZ.\crypto\asn1\a_utctm.c.\crypto\x509\x509_lu.cè FðxB4oFàØBœ FàxBHmF$oF°åBDÒHðxB| Fp{BÔ F^B oFàØB oFàØBoF åB•œ FàxBÀmF¨mFônF ðnFPæB| Fp{BÜ FpyBˆnFpnFänFX509_CRLcrlX509_CRL_INFOrevokednextUpdatelastUpdateX509_REVOKEDrevocationDatedefault.\crypto\bio\bio_lib.cFILE pointerfopen('','').\crypto\bio\bss_file.cr+a+.\crypto\engine\tb_digest.c.\crypto\rsa\rsa_sign.csignature has problems, re-make with post SSLeay045 ppFP{BhpFðxBpFTpFBASIC_CONSTRAINTSpathlencaCAsection:,name:,value:.\crypto\x509v3\v3_bcons.c.\crypto\asn1\a_int.c`.CÔÒH@³C¸ÒH@³CàpFÈpF0sF0/CDÒH€´C ÓH0³CìÒH0³C$ÔH0³C(sF0³CsF0³C@qF(qFDDRF0/C ÓH0³CìÒH0³C$ÔH0³CðqFØqFDDRF(sF0³C ÓH0³CìÒH0³C$ÔH0³CPrFDDRF0/C(sF0³CÀ/CØrFÀrFDDRFpriv_keypub_keyDSA_SIG.\crypto\dsa\dsa_asn1.c.\crypto\asn1\d2i_pu.c.\crypto\asn1\tasn_utl.c.\crypto\asn1\a_bitstr.c€SHA1 part of OpenSSL 0.9.7c 30 Sep 2003.\crypto\engine\eng_lib.c.\crypto\engine\eng_table.cOpenSSL DSA method.\crypto\dsa\dsa_ossl.cEric Young's PKCS#1 RSA.\crypto\rsa\rsa_eay.c.\crypto\bn\bn_blind.c.\crypto\bn\bn_ctx.c.\crypto\bn\bn_gcd.c.\crypto\bn\bn_rand.cOpenSSL DH Method.\crypto\dh\dh_key.c.\crypto\asn1\a_verify.c gC DÒHðxBÀ F^BHvF0mB‹.\crypto\x509v3\v3_crld.c.\crypto\x509v3\v3_akey.calways\‰F„Cÿÿÿÿ‡F\‰FP‰F@zBD‰F@„C8‡F8‰F F€zB¤,‰F`zB¥‰FP„C˜‡F€‡F‰F@zBÿÿÿÿ‰F0„Cè‡F‰FøˆF`„CðˆF {B0ˆFäˆFÔˆF {BȈFðxBxˆF¼ˆFNOTICEREFnoticenosorganizationUSERNOTICEexptextnoticerefPOLICYQUALINFOpqualidd.usernoticed.cpsuriPOLICYINFOqualifierspolicyidCERTIFICATEPOLICIES.\crypto\x509v3\v3_cpols.cuserNoticeCPSpolicyIdentifieria5orgnoticeNumbersexplicitText%*sCPS: %s %*sExplicit Text: %s %*sNumber%s: %*sOrganization: %s %*sUser Notice: %*sUnknown Qualifier: %*sPolicy: Registered IDIP AddressDirNameURIDNSemailEdiPartyNameX400NameothernameIP Address:%d.%d.%d.%dIP Address:DirName: URI:%sDNS:%semail:%sEdiPartyName:X400Name:othername:copy.\crypto\x509v3\v3_alt.cmoveRID‰ÌgFpzB‰ÀgFpzB¨‹Fì‹FPKEY_USAGE_PERIODNot After: Not Before: decipherOnlyDecipher OnlyencipherOnlyEncipher OnlycRLSignCRL SignkeyCertSignCertificate SignkeyAgreementKey AgreementdataEnciphermentData EnciphermentkeyEnciphermentKey EnciphermentnonRepudiationNon RepudiationdigitalSignatureDigital SignatureobjCAObject Signing CAemailCAS/MIME CAsslCASSL CAreservedUnusedobjsignObject Signingserverclient.\crypto\x509v3\v3_bitst.c.\crypto\x509v3\v3_skey.chash.\crypto\x509v3\v3_ia5.c.\crypto\x509v3\v3_utl.cNOfalseyesYEStrueЯI”ŽFЯI”ŽFBIGNUMð¯IÿÿÿäŽFð¯IÜŽFZLONGLONG.\crypto\asn1\x_long.c.\crypto\bn\bn_add.c.\crypto\bn\bn_div.c.\crypto\bn\bn_mont.c.\crypto\bn\bn_exp2.c.\crypto\bn\bn_exp.c.\crypto\rsa\rsa_none.c.\crypto\rsa\rsa_ssl.c.\crypto\rsa\rsa_oaep.c.\crypto\rsa\rsa_pk1.c.\crypto\evp\p_verify.c¤F€zB”F€zBøF „F€_F@zBÀD@F „FX509_ATTRIBUTEvalue.singlevalue.set.\crypto\evp\p_sign.c.\crypto\asn1\asn_pack.c.\crypto\asn1\a_set.cD™Fp{BÜ FpyB”<™F°íA‘F ,™F™Fp{B ™FÀyBü˜FÀyB è FðxB`‘Fð˜Fè˜F D•ИFàxBБFĘF‘DÒHðxB‘´˜FÐB¨˜F°D• ”˜FàxB’F„˜Fx˜FÀD‘d˜FDˆ’FT˜FD˜F@zB8˜FÀyBÐ’F(˜F˜F`yB‘˜FÐD“Fø—Fè—F^BÜ—FÀyB`“FЗFÀ—FpzB‘¬—F`yB¨“F˜—FˆŒ—F zBˆ|—FðDˆl—F zBð“F\—FT—F DH—F D<—FpzB‘ oFpzB•(—FàxBP”F—F‘DÒHðxB —FàD—FpzB ô–F D•à–FàxBØ”FЖFÀ–F DD™Fp{BÜ FpyB• <™F°íA`•F°–F‘¨–F`zB‘ –FðxB‘˜–FpzBЕF Œ–FÔ F^B„–F€uC0–Ft–FOCSP_SERVICELOClocatorOCSP_CRLIDcrlTimecrlNumcrlUrlOCSP_BASICRESPtbsResponseDataOCSP_RESPDATAresponseExtensionsresponsesproducedAtresponderIdOCSP_SINGLERESPsingleExtensionsthisUpdatecertStatuscertIdOCSP_CERTSTATUSvalue.unknownvalue.revokedvalue.goodOCSP_REVOKEDINFOrevocationReasonrevocationTimeOCSP_RESPIDvalue.byKeyvalue.byNameOCSP_RESPONSEresponseBytesresponseStatusOCSP_RESPBYTESresponseresponseTypeOCSP_REQUESToptionalSignaturetbsRequestOCSP_REQINFOrequestExtensionsrequestListrequestorNameOCSP_ONEREQsingleRequestExtensionsreqCertOCSP_CERTIDissuerKeyHashissuerNameHashhashAlgorithmOCSP_SIGNATUREcertssignatureAlgorithmDecNovOctSepAugJulJunMayAprMarFebJan.\crypto\asn1\t_x509.c:Bad time value%s %2d %02d:%02d:%02d %d%s GMT\ 000123456789ABCDEFÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ=, + .\crypto\asn1\a_strex.c\%02X\U%04lX\W%08lX.\crypto\asn1\a_enum.cCONF part of OpenSSL 0.9.7c 30 Sep 2003.\crypto\conf\conf_lib.cgroup= name=.\crypto\bn\bn_print.c%09lu.\crypto\bn\bn_recp.c%lu:%s:%s:%d:%s BMPSTRINGUNIVERSALSTRINGGENERALSTRINGVISIBLESTRINGGRAPHICSTRINGGENERALIZEDTIMEUTCTIMEIA5STRINGVIDEOTEXSTRINGT61STRINGPRINTABLESTRINGNUMERICSTRINGSETSEQUENCEUTF8STRINGENUMERATEDREALEXTERNALOBJECT DESCRIPTOROBJECTOCTET STRINGBIT STRINGINTEGERBOOLEANEOC%-18s%2d %-15s(unknown)WIN32OpenSSL defaultCONF_def part of OpenSSL 0.9.7c 30 Sep 2003.\crypto\conf\conf_def.cline [[%s]] [%s] %s=%s ENV.\crypto\conf\conf_api.c.\ssl\ssl_lib.cALL:!ADH:+RC4:@STRENGTHs->sid_ctx_length <= sizeof s->sid_ctxssl3-sha1ssl3-md5ssl2-md5SSLv2SSLv3TLSv1dss1DSS1.\ssl\ssl_sess.c%-23s %s Kx=%-8s Au=%-4s Enc=%-9s Mac=%-4s%s ø¥Fÿÿûÿÿÿÿÿÿÿÿÿÿÿÿÿè¥Fð‡Ô¥FÀÌ¥F ?Ä¥F?¼¥F?´¥F?¬¥F?¤¥F? ¥F?œ¥FÐ ÿ”¥FÀŒ¥F@À„¥F€À|¥FÀt¥FÀp¥FÀl¥F€Àh¥Fð‡`¥F ð‡Ø\F@ð‡\¥F€ð‡T¥Fð‡L¥Fð‡D¥Fð‡@¥F€ð‡à\FüWF ZF˜]Fð‡8¥F ÿ [FAÿ4¥Fÿ0¥Fÿÿ‡¨F `°F@`¸F@`,¥F$¥F¥Fü ¥Fü¥F ü¥F@üø¤F€üHIGHMEDIUMLOWEXPORT56EXPORT40EXPORTEXPFZAADHKRB5AESeFZAeNULLIDEARC23DESDESDSSaDHaNULLaFZAaDSSaRSAaKRB5EDHDHkFZAkEDHkDHdkDHrkRSAkKRB5COMPLEMENTOFDEFAULTCOMPLEMENTOFALLALLDEFAULT.\ssl\ssl_ciph.cSTRENGTH(NONE).\ssl\t1_clnt.c.\ssl\s2_clnt.c.\ssl\s3_clnt.c.\ssl\s23_clnt.c.\ssl\ssl_rsa.cSSL for verify callback.\ssl\ssl_cert.cx509 verification setup problemsx509 libwrong version numberwrong ssl versionwrong signature sizewrong signature lengthwrong number of key bitswrong message typewrong cipher returnedwrite bio not setunsupported ssl versionunsupported protocolunsupported optionunsupported compression algorithmunsupported cipherunknown stateunknown ssl versionunknown remote error typeunknown protocolunknown pkey typeunknown key exchange typeunknown cipher typeunknown cipher returnedunknown certificate typeunknown alert typeuninitializedunexpected recordunexpected messageunable to load ssl3 sha1 routinesunable to load ssl3 md5 routinesunable to load ssl2 md5 routinesunable to find ssl methodunable to find public key parametersunable to find dh parametersunable to extract public keyunable to decode dh certstried to use unsupported ciphertls rsa encrypted value length is wrongtls peer did not respond with certificate listtls client cert req with anon ciphertlsv1 alert user cancelledtlsv1 alert unknown catlsv1 alert record overflowtlsv1 alert protocol versiontlsv1 alert no renegotiationtlsv1 alert internal errortlsv1 alert insufficient securitytlsv1 alert export restrictiontlsv1 alert decrypt errortlsv1 alert decryption failedtlsv1 alert decode errortlsv1 alert access deniedssl session id is differentssl session id has bad lengthssl session id context too longssl session id conflictssl session id callback failedssl library has no ciphersssl handshake failuressl ctx has no default ssl versionsslv3 alert unsupported certificatesslv3 alert unknown remote error typesslv3 alert unexpected messagesslv3 alert peer error unsupported certificate typesslv3 alert peer error no ciphersslv3 alert peer error no certificatesslv3 alert peer error certificatesslv3 alert no certificatesslv3 alert illegal parametersslv3 alert handshake failuresslv3 alert decompression failuresslv3 alert certificate unknownsslv3 alert certificate revokedsslv3 alert certificate expiredsslv3 alert bad record macsslv3 alert bad certificatessl3 session id too shortssl3 session id too longssl2 connection id too longssl23 doing session id reusesignature for non signing certificateshort readsession id context uninitializedreuse cipher list not zeroreuse cert type not zeroreuse cert length not zerorequired cipher missingrecord too smallrecord too largerecord length mismatchread wrong packet typeread bio not setpublic key not rsapublic key is not rsapublic key encrypt errorprotocol is shutdownproblems mapping cipher functionspre mac length too longpeer error unsupported certificate typepeer error no cipherpeer error no certificatepeer error certificatepeer errorpeer did not return a certificatepath too longpacket length too longold session cipher not returnednull ssl method passednull ssl ctxno verify callbackno shared cipherno publickeyno protocols availableno private key assignedno privatekeyno method specifiedno compression specifiedno client cert receivedno cipher matchno cipher listno ciphers specifiedno ciphers passedno ciphers availableno certificate specifiedno certificate setno certificate returnedno certificate assignedno certificates returnednon sslv2 initial packetmissing verify messagemissing tmp rsa pkeymissing tmp rsa keymissing tmp dh keymissing rsa signing certmissing rsa encrypting certmissing rsa certificatemissing export tmp rsa keymissing export tmp dh keymissing dsa signing certmissing dh rsa certmissing dh keymissing dh dsa certmessage too longmaster key too longlibrary has no cipherslibrary buglength too shortlength mismatchkrb5 server tkt skewkrb5 server tkt not yet validkrb5 server tkt expiredkrb5 server rd_req (keytab perms?)krb5 server initkrb5 server bad ticketkrb5 client mk_req (expired tkt?)krb5 client initkrb5 client get credkrb5 client cc principal (no tkt?)krb5key arg too longinvalid trustinvalid purposeinvalid commandinvalid challenge lengthillegal paddinghttp requesthttps proxy requestgot a fin before a ccsextra data in messageexcessive message sizeerror in received cipher listerror generating tmp rsa keyencrypted length too longdigest check faileddh public value length is wrongdecryption failed or bad record macdecryption faileddata length too longdata between ccs and finishedconnection type not setconnection id is differentcompression library errorcompression failurecompressed length too longcipher table src errorcipher or hash unavailablecipher code wrong lengthchallenge is differentcert length mismatchcertificate verify failedccs received earlyca dn too longca dn length mismatchbn libblock cipher pad is wrongbio not setbad write retrybad statebad ssl session id lengthbad ssl filetypebad signaturebad rsa signaturebad rsa modulus lengthbad rsa e lengthbad rsa encryptbad rsa decryptbad response argumentbad protocol version numberbad packet lengthbad message typebad mac decodebad lengthbad hello requestbad dsa signaturebad digest lengthbad dh p lengthbad dh pub key lengthbad dh g lengthbad decompressionbad data returned by callbackbad checksumbad change cipher specbad authentication typebad alert recordattempt to reuse session in different contextapp data in handshakeWRITE_PENDINGTLS1_SETUP_KEY_BLOCKTLS1_ENCTLS1_CHANGE_CIPHER_STATESSL_writeSSL_VERIFY_CERT_CHAINSSL_use_RSAPrivateKey_fileSSL_use_RSAPrivateKey_ASN1SSL_use_RSAPrivateKeySSL_use_PrivateKey_fileSSL_use_PrivateKey_ASN1SSL_use_PrivateKeySSL_use_certificate_fileSSL_use_certificate_ASN1SSL_use_certificateSSL_UNDEFINED_FUNCTIONSSL_shutdownSSL_set_wfdSSL_set_trustSSL_set_session_id_contextSSL_set_sessionSSL_set_rfdSSL_set_purposeSSL_SET_PKEYSSL_set_fdSSL_SET_CERTSSL_SESS_CERT_NEWSSL_SESSION_print_fpSSL_SESSION_newSSL_RSA_PUBLIC_ENCRYPTSSL_RSA_PRIVATE_DECRYPTSSL_readSSL_newSSL_load_client_CA_fileSSL_INIT_WBIO_BUFFERSSL_GET_SIGN_PKEYSSL_GET_SERVER_SEND_CERTSSL_GET_PREV_SESSIONSSL_GET_NEW_SESSIONSSL_do_handshakeSSL_CTX_use_RSAPrivateKey_fileSSL_CTX_use_RSAPrivateKey_ASN1SSL_CTX_use_RSAPrivateKeySSL_CTX_use_PrivateKey_fileSSL_CTX_use_PrivateKey_ASN1SSL_CTX_use_PrivateKeySSL_CTX_use_certificate_fileSSL_CTX_use_certificate_chain_fileSSL_CTX_use_certificate_ASN1SSL_CTX_use_certificateSSL_CTX_set_trustSSL_CTX_set_ssl_versionSSL_CTX_set_session_id_contextSSL_CTX_set_purposeSSL_CTX_newSSL_CTX_check_private_keySSL_ctrlSSL_CREATE_CIPHER_LISTSSL_COMP_add_compression_methodSSL_clearSSL_CIPHER_STRENGTH_SORTSSL_CIPHER_PROCESS_RULESTRSSL_check_private_keySSL_CERT_NEWSSL_CERT_INSTANTIATESSL_CERT_INSTSSL_CERT_DUPSSL_BYTES_TO_CIPHER_LISTSSL_BAD_METHODSSL_add_file_cert_subjects_to_stackSSL_add_dir_cert_subjects_to_stackSSL3_WRITE_PENDINGSSL3_WRITE_BYTESSSL3_SETUP_KEY_BLOCKSSL3_SETUP_BUFFERSSSL3_SEND_SERVER_KEY_EXCHANGESSL3_SEND_SERVER_HELLOSSL3_SEND_SERVER_CERTIFICATESSL3_SEND_CLIENT_VERIFYSSL3_SEND_CLIENT_KEY_EXCHANGESSL3_SEND_CLIENT_CERTIFICATESSL3_SEND_CERTIFICATE_REQUESTSSL3_READ_NSSL3_READ_BYTESSSL3_PEEKSSL3_OUTPUT_CERT_CHAINSSL3_GET_SERVER_HELLOSSL3_GET_SERVER_DONESSL3_GET_SERVER_CERTIFICATESSL3_GET_RECORDSSL3_GET_MESSAGESSL3_GET_KEY_EXCHANGESSL3_GET_FINISHEDSSL3_GET_CLIENT_KEY_EXCHANGESSL3_GET_CLIENT_HELLOSSL3_GET_CLIENT_CERTIFICATESSL3_GET_CERT_VERIFYSSL3_GET_CERTIFICATE_REQUESTSSL3_GENERATE_KEY_BLOCKSSL3_ENCSSL3_CTX_CTRLSSL3_CTRLSSL3_CONNECTSSL3_CLIENT_HELLOSSL3_CHECK_CERT_AND_ALGORITHMSSL3_CHANGE_CIPHER_STATESSL3_CALLBACK_CTRLSSL3_ACCEPTSSL2_WRITESSL2_SET_CERTIFICATESSL2_READ_INTERNALSSL2_READSSL2_PEEKSSL2_GENERATE_KEY_MATERIALSSL2_ENC_INITSSL2_CONNECTSSL2_ACCEPTSSL23_WRITESSL23_READSSL23_PEEKSSL23_GET_SERVER_HELLOSSL23_GET_CLIENT_HELLOSSL23_CONNECTSSL23_CLIENT_HELLOSSL23_ACCEPTSERVER_VERIFYSERVER_HELLOSERVER_FINISHREQUEST_CERTIFICATEREAD_Ni2d_SSL_SESSIONGET_SERVER_VERIFYGET_SERVER_HELLOGET_SERVER_FINISHEDGET_CLIENT_MASTER_KEYGET_CLIENT_HELLOGET_CLIENT_FINISHEDDO_SSL3_WRITEd2i_SSL_SESSIONCLIENT_MASTER_KEYCLIENT_HELLOCLIENT_FINISHEDCLIENT_CERTIFICATEserver finishedclient finishedTLSv1 part of OpenSSL 0.9.7c 30 Sep 2003RC4-64-MD5DES-CBC3-MD5DES-CBC-MD5IDEA-CBC-MD5RC2-CBC-MD5EXP-RC2-CBC-MD5RC4-MD5EXP-RC4-MD5SSLv2 part of OpenSSL 0.9.7c 30 Sep 2003.\ssl\s2_lib.cs->session->master_key_length >= 0 && s->session->master_key_length < sizeof s->session->master_keyerror >= 0 && error <= sizeof bufc->iv_len <= sizeof s->session->key_args->s2->key_material_length <= sizeof s->s2->key_material.\ssl\s2_enc.c.\ssl\s2_pkt.cmac_size <= MAX_MAC_SIZESRVRCLNTADH-AES256-SHADHE-RSA-AES256-SHADHE-DSS-AES256-SHADH-RSA-AES256-SHADH-DSS-AES256-SHAAES256-SHAADH-AES128-SHADHE-RSA-AES128-SHADHE-DSS-AES128-SHADH-RSA-AES128-SHADH-DSS-AES128-SHAAES128-SHADHE-DSS-RC4-SHAEXP1024-DHE-DSS-RC4-SHAEXP1024-RC4-SHAEXP1024-DHE-DSS-DES-CBC-SHAEXP1024-DES-CBC-SHAEXP1024-RC2-CBC-MD5EXP1024-RC4-MD5FZA-FZA-CBC-SHAFZA-NULL-SHAEDH-RSA-DES-CBC3-SHAEDH-RSA-DES-CBC-SHAEXP-EDH-RSA-DES-CBC-SHAEDH-DSS-DES-CBC3-SHAEDH-DSS-DES-CBC-SHAEXP-EDH-DSS-DES-CBC-SHADH-RSA-DES-CBC3-SHADH-RSA-DES-CBC-SHAEXP-DH-RSA-DES-CBC-SHADH-DSS-DES-CBC3-SHADH-DSS-DES-CBC-SHAEXP-DH-DSS-DES-CBC-SHADES-CBC3-SHADES-CBC-SHAEXP-DES-CBC-SHAIDEA-CBC-SHARC4-SHAADH-DES-CBC3-SHAADH-DES-CBC-SHAEXP-ADH-DES-CBC-SHAADH-RC4-MD5EXP-ADH-RC4-MD5NULL-SHANULL-MD5SSLv3 part of OpenSSL 0.9.7c 30 Sep 2003.\ssl\s3_lib.cCCCBB.\ssl\s3_enc.c.\ssl\s3_both.c.\ssl\s3_pkt.cSSL alert number SSLv2/3 compatibility part of OpenSSL 0.9.7c 30 Sep 2003.\ssl\s23_lib.cIV blockclient write keyserver write key.\ssl\t1_enc.ckey expansionmaster secretÿÿÿÿ¿BEÓBE.\crypto\comp\comp_lib.cEVP part of OpenSSL 0.9.7c 30 Sep 2003EVP_CIPHER_CTX_iv_length(ctx) <= sizeof ctx->ivctx->cipher->block_size == 1 || ctx->cipher->block_size == 8 || ctx->cipher->block_size == 16.\crypto\evp\evp_enc.cbl <= sizeof ctx->bufinl > 0b <= sizeof ctx->bufb <= sizeof ctx->finalbuffer.\crypto\bio\bf_buff.ctq ]E@]E`¿B@ÌCpzEtBqF@dp]E]E°]EÐ"Cà$C˜£ _Eà]Eôp~E~E¥ _E^Eôp~E~E¤ _EP^Eôp~E~E¢ _E^Eôp~E~E§ _Eà]Eôp~E~E© _E^Eôp~E~E¨ _EP^Eôp~E~E¦ _E^Eôp~E~E«  _Eà]Eôp~E~E­  _E^Eôp~E~E¬  _EP^Eôp~E~Eª  _E^Eôp~E~E%J `E€_EÐaEÐ`E@bE'K `E°_EÐaEÐ`E@bE(L `E``EÐaEÐ`E@bE&I `Eð_EÐaEÐ`E@bE¦J `E€_EÐaEÐ`E@bEbJ `E€_EÐaEÐ`E@bE.\crypto\evp\e_rc2.cl <= sizeof iv°bEÐbEa°bEÐbE"dE`cEØp~E~E#dEÀcEØp~E~E.dEcEØp~E~E$dEcEØp~E~E+ðeE`eE€p~E~E<ðeE eE€p~E~E>ðeE eE€p~E~E ðeE dE€p~E~E,@fE`eE€p~E~E=@fE eE€p~E~E?@fE eE€p~E~E!@fE dE€p~E~E°gE0gE€p~E~E°gE`gE€p~E~E-°gEgE€p~E~E°gEfE€p~E~EphE€hE`iEÓH0³C $ÔH0³C4ÚF´CØÙFÀÙFL ¥FlengthCERTIFICATECERTIFICATE REQUESTNEW CERTIFICATE REQUESTX509 CRLRSA PRIVATE KEYDSA PRIVATE KEY.\crypto\pem\pem_pkey.cENCRYPTED PRIVATE KEYPRIVATE KEYANY PRIVATE KEYlen <= sizeof ctx->key.\crypto\hmac\hmac.cj <= sizeof ctx->key.\crypto\engine\tb_cipher.cLoad certs from files in a directory.\crypto\x509\by_dir.c%s/%08lx.%s%dLoad file into cache.\crypto\x509\by_file.cMD2 part of OpenSSL 0.9.7c 30 Sep 2003.\crypto\evp\evp_lib.cl <= sizeof c->ivj <= sizeof c->iv¥ccÆ„||ø™wwî{{ö òòÿ½kkÖ±ooÞTÅÅ‘P00`©ggÎ}++Vþþçb×׵櫫MšvvìEÊÊ‚‚@Éɉ‡}}úúúïëYY²ÉGGŽ ððûì­­AgÔÔ³ý¢¢_꯯E¿œœ#÷¤¤S–rrä[ÀÀ›Â··uýýᮓ“=j&&LZ66lA??~÷÷õOÌ̃\44hô¥¥Q4ååÑññù“qqâsØØ«S11b?* RÇÇ•e##F^ÃÃ(0¡––7 µšš/ 6$›€€=ââß&ëëÍi''NͲ²Ÿuuê žƒƒt,,X.4-6²nnÜîZZ´û  [öRR¤M;;vaÖַγ³}{))R>ããÝq//^—„„õSS¦hÑѹ,ííÁ` @üüãȱ±yí[[¶¾jjÔFËËÙ¾¾gK99rÞJJ”ÔLL˜èXX°JÏÏ…kÐл*ïïÅ媪OûûíÅCC†×MMšU33f”……ÏEEŠùùéþðPP D<ÝKK–ܽ½a†‹‹ …ŠŠppàB>>|ĵµqªffÌØHHöö÷£aaÂ_55jùWW®Ð¹¹i‘††XÁÁ™':¹žž'8ááÙøøë³˜˜+3"»iiÒpÙÙ©‰ŽŽ§””3¶››-"<’‡‡ ééÉIηÿUUªx((PzßߥŒŒø¡¡Y€‰‰  Ú¿¿e1ææ×ÆBB„¸hhÐÃAA‚°™™)w--Z˰°{üTT¨Ö»»m:,ccÆ¥||ø„wwî™{{öòòÿ kkÖ½ooÞ±ÅÅ‘T00`PggΩ++V}þþç××µb««MævvìšÊÊE‚‚Éɉ@}}ú‡úúïYY²ëGGŽÉððû ­­AìÔÔ³g¢¢_ý¯¯Eꜜ#¿¤¤S÷rrä–ÀÀ›[··uÂýýá““=®&&Lj66lZ??~A÷÷õÌ̃O44h\¥¥QôååÑ4ññùqqâ“ØØ«s11bS*? ÇÇ•R##FeÃÃ^0(––7¡ šš/µ $6€€›ââß=ëëÍ&''Ni²²ÍuuêŸ ƒƒž,,Xt4.6-nnܲZZ´î  [ûRR¤ö;;vMÖÖ·a³³}Î))R{ããÝ>//^q„„—SS¦õÑѹhííÁ, @`üüã±±yÈ[[¶íjjÔ¾ËËF¾¾gÙ99rKJJ”ÞLL˜ÔXX°èÏÏ…JÐлkïïÅ*ªªOåûûíCC†ÅMMš×33fU……”EEŠÏùùéþPP ð<!KK–ݽ½aÜ‹‹ †ŠŠ…ppà>>|BµµqÄff̪HHØöö÷aa£55j_WW®ù¹¹iІ†‘ÁÁ™X:'žž'¹ááÙ8øøë˜˜+³"3iiÒ»ÙÙ©pŽŽ‰””3§››-¶<"‡‡’ééÉ Î·IUUªÿ((PxßߥzŒŒ¡¡Yø‰‰ € ¿¿eÚææ×1BB„ÆhhиAA‚Ù™)°--Zw°°{ËTT¨ü»»mÖ,:cÆ¥c|ø„|wî™w{ö{òÿ òkÖ½koÞ±oÅ‘TÅ0`P0gΩg+V}+þçþ×µb׫Mæ«vìšvÊEÊ‚‚ɉ@É}ú‡}úïúY²ëYGŽÉGðû ð­Aì­Ô³gÔ¢_ý¢¯Eꯜ#¿œ¤S÷¤rä–rÀ›[À·u·ýáý“=®“&Lj&6lZ6?~A?÷õ÷̃OÌ4h\4¥Qô¥åÑ4åñùñqâ“qØ«sØ1bS1*? Ç•RÇ#Fe#Ã^Ã0(–7¡– š/µš $6€›€âß=âëÍ&ë'Ni'²ͲuêŸu  ƒžƒ,Xt,4.6-nܲnZ´îZ [û R¤öR;vM;Ö·aÖ³}γ)R{)ãÝ>ã/^q/„—„S¦õSѹhÑíÁ,í @` üãü±yȱ[¶í[jÔ¾jËF˾gÙ¾9rK9J”ÞJL˜ÔLX°èXÏ…JÏлkÐïÅ*ïªOåªûíûC†ÅCMš×M3fU3…”…EŠÏEùéùþP ðP!K–ÝK½aܽ‹ †‹Š…Špàp>|B>µqĵf̪fHØHö÷öa£a5j_5W®ùW¹i醑†Á™XÁ:'ž'¹žáÙ8áøëø˜+³˜"3iÒ»iÙ©pÙŽ‰Ž”3§”›-¶›<"‡’‡éÉ é·IÎUªÿU(Px(ߥzߌŒ¡Yø¡‰ €‰  ¿eÚ¿æ×1æB„ÆBhиhA‚ÃA™)°™-Zw-°{˰T¨üT»mÖ»,:Æ¥ccø„||î™wwö{{ÿ òòÖ½kkÞ±oo‘TÅÅ`P00ΩggV}++çþþµb××Mæ««ìšvvEÊÊ‚‚‰@ÉÉú‡}}ïúú²ëYYŽÉGGû ððAì­­³gÔÔ_ý¢¢E꯯#¿œœS÷¤¤ä–rr›[ÀÀu··áýý=®““Lj&&lZ66~A??õ÷÷ƒOÌÌh\44Qô¥¥Ñ4ååùññâ“qq«sØØbS11*? •RÇÇFe##^ÃÃ0(7¡–– /µšš $6›€€ß=ââÍ&ëëNi''Ͳ²êŸuu žƒƒXt,,4.6-ܲnn´îZZ[û  ¤öRRvM;;·aÖÖ}γ³R{))Ý>ãã^q//—„„¦õSS¹hÑÑÁ,íí@` ãüüyȱ±¶í[[Ô¾jjFËËgÙ¾¾rK99”ÞJJ˜ÔLL°èXX…JÏÏ»kÐÐÅ*ïïO媪íûû†ÅCCš×MMfU33”……ŠÏEEéùùþ ðPPxD<<%ºŸŸK㨨¢óQQ]þ££€À@@Š?­’’!¼pH88ñõõcß¼¼wÁ¶¶¯uÚÚBc!! 0åÿÿýóó¿mÒÒLÍÍ &5Ã/ìì¾á__5¢——ˆÌDD.9“WÄÄUò§§ü‚~~zG==Ȭddºç]]2+æ•ssÀ ``˜žÑOO£ÜÜDf""T~**;« ƒˆˆŒÊFFÇ)îîkÓ¸¸(<§yÞÞ¼â^^ ­vÛÛÛ;ààdV22tN:: ’ÛII Hl$$¸ä\\Ÿ]½nÓÓCשּׁĦbb9¨‘‘1¤••Ó7ääò‹yyÕ2çç‹CÈÈnY77Ú·mmŒ±dÕÕœÒNNIà©©Ø´ll¬úVVóôôÏ%êêʯeeôŽzzGé®®oÕººðˆxxJo%%\r..8$Wñ¦¦sÇ´´—QÆÆË#èè¡|ÝÝèœtt>!–ÝKKaܽ½ †‹‹…ŠŠàpp|B>>qĵµÌªffØHH÷öö£aaj_55®ùWWiй¹‘††™XÁÁ:''¹žžÙ8ááëøø+³˜˜"3Ò»ii©pÙÙ‰ŽŽ3§””-¶››<"’‡‡É éé‡IÎΪÿUUPx((¥zßߌŒYø¡¡ €‰‰ eÚ¿¿×1ææ„ÆBBиhh‚ÃAA)°™™Zw--{˰°¨üTTmÖ»»,:cccc||||wwww{{{{òòòòkkkkooooÅÅÅÅ0000gggg++++þþþþ×××׫«««vvvvÊÊÊÊ‚‚‚‚ÉÉÉÉ}}}}úúúúYYYYGGGGðððð­­­­ÔÔÔÔ¢¢¢¢¯¯¯¯œœœœ¤¤¤¤rrrrÀÀÀÀ····ýýýý““““&&&&6666????÷÷÷÷ÌÌÌÌ4444¥¥¥¥ååååññññqqqqØØØØ1111ÇÇÇÇ####ÃÃÃÖ–––šššš€€€€ââââëëëë''''²²²²uuuu ƒƒƒƒ,,,,nnnnZZZZ    RRRR;;;;ÖÖÖÖ³³³³))))ãããã////„„„„SSSSÑÑÑÑíííí üüüü±±±±[[[[jjjjËËË˾¾¾¾9999JJJJLLLLXXXXÏÏÏÏÐÐÐÐïïï着ªªûûûûCCCCMMMM3333…………EEEEùùùùPPPP<<<<ŸŸŸŸ¨¨¨¨QQQQ££££@@@@’’’’8888õõõõ¼¼¼¼¶¶¶¶ÚÚÚÚ!!!!ÿÿÿÿóóóóÒÒÒÒÍÍÍÍ ìììì____————DDDDÄÄÄħ§§§~~~~====dddd]]]]ssss````OOOOÜÜÜÜ""""****ˆˆˆˆFFFFîîî¸¸ÞÞÞÞ^^^^ ÛÛÛÛàààà2222:::: IIII$$$$\\\\ÂÂÂÂÓÓÓÓ¬¬¬¬bbbb‘‘‘‘••••ääääyyyyççççÈÈÈÈ7777mmmmÕÕÕÕNNNN©©©©llllVVVVôôôôêêêêeeeezzzz®®®®ººººxxxx%%%%....¦¦¦¦´´´´ÆÆÆÆèèèèÝÝÝÝttttKKKK½½½½‹‹‹‹ŠŠŠŠpppp>>>>µµµµffffHHHHööööaaaa5555WWWW¹¹¹¹††††ÁÁÁÁžžžžááááøøøø˜˜˜˜iiiiÙÙÙÙŽŽŽŽ””””››››‡‡‡‡ééééÎÎÎÎUUUU((((ßßßߌŒŒŒ¡¡¡¡‰‰‰‰ ¿¿¿¿ææææBBBBhhhhAAAA™™™™----°°°°TTTT»»»»P§ôQSeA~ä–^':Ëk«;ñE«Xú¬“ãKUú0 ömv­‘v̈%Lõü×åO×Ë*Å€D5&£bµIZ±Þgº%˜êEáÀþ]u/ÃðL£—FÆùÓkç_•œ’ëzm¿ÚYR•-ƒ¾ÔÓ!tX)iàIDÈÉŽj‰ÂuxyŽôk>X™Ýq¹'¶Oá¾­ˆðf¬ É´:Î}Jßc‚1å`3Q—ESbàwd±„®k» þ”+ùXhHpýE‡lÞ”·ø{R#Ós«âKrWã*«Uf(ë²µ/š{ņ¥7Óò‡(0²¥¿#ºj\‚í+ÏŠ’´y§ðòó¡âiNÍôÚeÕ¾b4ÑŠþ¦ÄS.4 Uó¢2áŠuëö¤9ìƒ ªï`@Ÿq^Qn½ùŠ!>=Ý–®>ÝF½æMµT‘]ÄqoÔÿP`$û˜—é½ÖÌC@‰wžÙg½Bè°ˆ‹‰8[çÛîÈyG |¡éB|É„øƒ†€ Hí+2¬pNrZlûÿýV8…Õ®='9-6dÙ !¦\hÑT[›:.6$±g çW“Ò–î´ž‘›OÅÀ€¢ ÜaiKwZ º“âå* ÀCà"< ­Ç‹ò¹¨¶-È©…ñWLu¯»Ý™îý`£Ÿ&÷¼õr\Å;fD4~û[v)C‹ÜÆ#Ëhüí¶cñä¸ÊÜ1×…cB@"— Æ„}$J…ø=»Ò2ù®m¡)ÇK/žó0²ÜìR† ÐãÁwl³+™¹p©úH”"déGÄŒü¨?ð Ø,}Vï3"ÇNI‡ÁÑ8Ùþ¢ÊŒ6 Ô˜Ïõ¦(Þz¥&Ž·Ú¤¿­?ä:, ’xP›Ì_jbF~TÂöè¸Ø^÷9.õ¯Ã‚¾€]Ÿ|“Ði©-Õo³%Ï;™¬È§}ncœè{»;Û x&ÍôYn·šì¨šOƒen•æ~æÿªϼ!æèïÙ›çºÎ6oJÔ ŸêÖ|°)¯²¤11#?*0”¥ÆÀf¢57¼Nt¦Ê‚ü°Ðàا3J˜ñ÷ÚìAPÍ/ö‘ÖMvM°ïCTMªÌß–äãµÑžˆjL¸,ÁQeFê^]5Œst‡ú.A ûZg³RÒÛ’3VéGÖmŒaךz ¡7ŽøY‰<ëî'©Î5Éa·íåá<±GzYßÒœ?sòUyο7ÇsêÍ÷S[ªý_o=߆ÛDxó¯Ê>Äh¹,4$8_@£Ârà %⼋I<(A• ÿq¨9Þ³ œä´ØÁVda„Ë{p¶2Õt\lHBW¸Ð§ôQPeA~S¤Ã^':–k«;ËEñXú¬«ãK“ú0 Umv­öv̈‘Lõ%×åOüË*Å×D5&€£bµZ±ÞIº%gêE˜Àþ]áu/ÃðL—F£ùÓkÆ_眒•zm¿ëYR•Úƒ¾Ô-!tXÓiàI)ÈÉŽD‰ÂujyŽôx>X™kq¹'ÝOá¾¶­ˆð¬ Éf:Î}´Jßc1å‚3Q—`SbEwd±à®k»„ þ+ù”hHpXýElÞ”‡ø{R·Ós«#KrâãW«Uf*(ë²µ/{ņš7Ó¥‡(0ò¥¿#²jº‚í\ÏŠ+´y§’òóðâiN¡ôÚe;Õb4Ñþ¦ÄŠS.4Uó¢ áŠ2ëö¤uìƒ 9ï`@ªŸq^n½QŠ!>ùÝ–=>Ý®½æMFT‘µ]ÄqÔoP`ÿû˜$é½Ö—C@‰ÌžÙgwBè°½‹‰ˆ[ç8îÈyÛ |¡GB|鄸Ɇ€ ƒí+2Hp¬rZlNÿýû8…VÕ®=9-6'Ù d¦\h!T[›Ñ.6$:g ±çW“–î´Ò‘›žÅÀ€O Üa¢KwZiº“â * Àåà"4$8,@£Â_Ãr%â¼ I<(‹• ÿA¨9q³ Þä´ØœÁVd„Ë{a¶2Õp\lHtW¸ÐBôQP§A~Seä':–^«;ËkñEú¬«XãK“0 Uúv­öm̈‘võ%LåOü×*Å×Ë5&€Dbµ£±ÞIZº%gêE˜þ]áÀ/ÃuLðF£—ÓkÆùç_’•œm¿ëzR•ÚY¾Ô-ƒtXÓ!àI)iÉŽDÈÂuj‰ŽôxyX™k>¹'Ýqá¾¶Oˆð­ Éf¬Î}´:ßcJå‚1Q—`3SbEd±àwk»„®þ ù”+HpXhEýÞ”‡l{R·øs«#ÓKrâãWUf*«ë²(µ/Âņš{7Ó¥(0ò‡¿#²¥ºjí\‚ÏŠ+y§’´óðòiN¡âÚeÍôÕ¾4Ñb¦ÄŠþ.4Só¢ UŠ2áö¤uëƒ 9ì`@ªïq^Ÿn½Q!>ùŠÝ–=>Ý®æMF½T‘µÄq]oÔP`ÿ˜$û½Ö—é@‰ÌCÙgwžè°½B‰ˆ‹ç8[ÈyÛî|¡G B|鄸ɀ ƒ†+2Hí¬pZlNrýûÿ…V8®=Õ-6'9 dÙ\h!¦[›ÑT6$:. ±gW“çî´Ò–›ž‘À€OÅÜa¢ wZiK“â º Àå*"Ä$8,4£Â_@rÃâ¼ %<(‹I ÿA•¨9q Þ³´ØœäVdÁË{a„2Õp¶lHt\¸ÐBWQP§ô~SeAä:–^';Ëk«ñE¬«XúK“ã Uú0­ömvˆ‘vÌõ%LOü×åÅ×Ë*&€D5µ£bÞIZ±%gºE˜ê]áÀþÃu/ðL£—FkÆùÓç_•œ’¿ëzm•ÚYRÔ-ƒ¾XÓ!tI)iàŽDÈÉuj‰ÂôxyŽ™k>X'Ýq¹¾¶Oáð­ˆÉf¬ }´:ÎcJßå‚1—`3QbES±àwd»„®kþ ù”+pXhHýE”‡lÞR·ø{«#ÓsrâKãWf*«U²(ë/µ†š{ÅÓ¥70ò‡(#²¥¿ºjí\‚Š+ϧ’´yóðòN¡âieÍôÚÕ¾Ñb4ÄŠþ¦4S.¢ Uó2ኤuëö 9ìƒ@ªï`^Ÿq½Qn>ùŠ!–=ÝÝ®>MF½æ‘µTq]ÄoÔ`ÿP$û˜Ö—齉ÌC@gwžÙ°½B舋‰ç8[yÛîÈ¡G ||éBøÉ„ ƒ†€2Hí+¬plNrZýûÿV8…=Õ®6'9- dÙh!¦\›ÑT[$:.6 ±g “çW´Ò–îž‘›€OÅÀa¢ ÜZiKwâ º“Àå* Äh8,4$Â_@£rü %â(‹I<ÿA• 9q¨Þ³ Øœä´dÁV{a„ËÕp¶2Ht\lÐBW¸RRRR jjjjÕÕÕÕ00006666¥¥¥¥8888¿¿¿¿@@@@££££žžžžóóóó××××ûûûû||||ãããã9999‚‚‚‚››››////ÿÿÿÿ‡‡‡‡4444ŽŽŽŽCCCCDDDDÄÄÄÄÞÞÞÞééééËËËËTTTT{{{{””””2222¦¦¦¦ÂÂÂÂ####====îîîîLLLL•••• BBBBúúúúÃÃÃÃNNNN....¡¡¡¡ffff((((ÙÙÙÙ$$$$²²²²vvvv[[[[¢¢¢¢IIIImmmm‹‹‹‹ÑÑÑÑ%%%%rrrrøøøøöööödddd††††hhhh˜˜˜˜ÔÔÔÔ¤¤¤¤\\\\ÌÌÌÌ]]]]eeee¶¶¶¶’’’’llllppppHHHHPPPPýýýýíííí¹¹¹¹ÚÚÚÚ^^^^FFFFWWWW§§§§„„„„ØØØØ««««ŒŒŒŒ¼¼¼¼ÓÓÓÓ ÷÷÷÷ääääXXXX¸¸¸¸³³³³EEEEÐÐÐÐ,,,,ÊÊÊÊ????ÁÁÁÁ¯¯¯¯½½½½ŠŠŠŠkkkk::::‘‘‘‘AAAAOOOOggggÜÜÜÜêêêê————òòòòÏÏÏÏÎÎÎÎðððð´´´´ææææssss––––¬¬¬¬tttt""""çççç­­­­5555…………ââââùùùù7777èèèèuuuußßßßnnnnGGGGññññqqqq))))ÅÅÅʼn‰‰‰oooo····bbbbªªªª¾¾¾¾üüüüVVVV>>>>KKKKÆÆÆÆÒÒÒÒyyyy ššššÛÛÛÛÀÀÀÀþþþþxxxxÍÍÍÍZZZZôôôôÝÝÝݨ¨¨¨3333ˆˆˆˆÇÇÇÇ1111±±±±YYYY''''€€€€ìììì____````QQQQ©©©©µµµµJJJJ ----ååååzzzzŸŸŸŸ““““ÉÉÉÉœœœœïïïï    àààà;;;;MMMM®®®®****õõõõ°°°°ÈÈÈÈëëëë»»»»<<<<ƒƒƒƒSSSS™™™™aaaa++++~~~~ººººwwwwÖÖÖÖ&&&&ááááiiiiccccUUUU!!!! }}}} @€6RC2 part of OpenSSL 0.9.7c 30 Sep 2003.\crypto\asn1\evp_asn1.cRC4 part of OpenSSL 0.9.7c 30 Sep 2003IDEA part of OpenSSL 0.9.7c 30 Sep 2003unknown control commandresult too smallresult too largeno result bufferindex too smallindex too largecommon ok and cancel charactersUI_set_resultUI_new_methodUI_get0_resultUI_dup_verify_stringUI_dup_input_stringUI_dup_input_booleanUI_dup_info_stringUI_dup_error_stringUI_ctrlGENERAL_ALLOCATE_STRINGGENERAL_ALLOCATE_PROMPTGENERAL_ALLOCATE_BOOLEANunsupported requestorname typeunknown nidunknown message digeststatus too oldstatus not yet validstatus expiredsigner certificate not foundsignature failureserver write errorserver response parse errorserver response errorserver read errorroot ca not trustedresponse contains no revocation datarequest not signedprivate key does not match certificateno revoked timeno response datano public keyno contentno certificates in chainnot basic responsenextupdate before thisupdatemissing ocspsigning usageerror parsing urlerror in thisupdate fielderror in nextupdate fielddigest errcertificate verify errorbad dataREQUEST_VERIFYOCSP_sendreq_bioOCSP_response_get1_basicOCSP_request_verifyOCSP_request_signOCSP_parse_urlOCSP_MATCH_ISSUERIDOCSP_check_validityOCSP_CHECK_ISSUEROCSP_CHECK_IDSOCSP_CHECK_DELEGATEDOCSP_basic_verifyOCSP_basic_signOCSP_basic_add1_statusD2I_OCSP_NONCECERT_ID_NEWASN1_STRING_encodeversion incompatibilityunimplemented digestunimplemented cipherrsa not implementedprovide parametersno unload functionno such engineno referenceno load functionno indexno control functionnot loadednot initialisedinvalid stringinvalid init valueinvalid cmd numberinvalid cmd nameinvalid argumentinternal list errorinit failed'id' or 'name' missingcould not obtain hardware handlefinish failedfailed loading public keyfailed loading private keyengine section errorengine is not in the listengines section errordso not foundDSO failuredsa not implementeddh not implementedctrl command not implementedconflicting engine idcommand takes no inputcommand takes inputcmd not executableargument is not a numberalready loadedSET_DATA_CTXLOG_MESSAGEINT_ENGINE_CONFIGUREINT_CTRL_HELPERENGINE_up_refENGINE_UNLOAD_KEYENGINE_TABLE_REGISTERENGINE_set_nameENGINE_set_idENGINE_SET_DEFAULT_TYPEENGINE_set_default_stringENGINE_removeENGINE_newENGINE_MODULE_INITENGINE_load_public_keyENGINE_load_private_keyENGINE_LIST_REMOVEENGINE_LIST_ADDENGINE_initENGINE_get_prevENGINE_get_nextENGINE_get_digestENGINE_GET_DEFAULT_TYPEENGINE_get_cipherENGINE_freeENGINE_finishENGINE_ctrl_cmd_stringENGINE_ctrl_cmdENGINE_ctrlENGINE_cmd_is_executableENGINE_by_idENGINE_addDYNAMIC_LOADDYNAMIC_GET_DATA_CTXDYNAMIC_CTRLfunctionality not supportedcould not unload the shared librarycould not bind to the requested symbol namethe meth_data stack is corruptset filename faileda null shared library handle was usedno filenamename translation failedcould not load the shared librarycleanup method function failedfilename too bigdso already loadedcontrol command failedWIN32_UNLOADWIN32_NAME_CONVERTERWIN32_LOADWIN32_BIND_VARWIN32_BIND_FUNCVMS_UNLOADVMS_LOADVMS_BIND_VARDSO_up_refDSO_set_name_converterDSO_set_filenameDSO_new_methodDSO_loadDSO_get_loaded_filenameDSO_get_filenameDSO_freeDSO_ctrlDSO_convert_filenameDSO_bind_varDSO_bind_funcDL_UNLOADDL_NAME_CONVERTERDL_LOADDL_BIND_VARDL_BIND_FUNCDLFCN_UNLOADDLFCN_NAME_CONVERTERDLFCN_LOADDLFCN_BIND_VARDLFCN_BIND_FUNCPRNG not seededSSLEAY_RAND_BYTESRAND_get_rand_methodunsupported pkcs12 modeunknown digest algorithmpkcs12 pbe crypt errorpkcs12 cipherfinal errorpkcs12 algor cipherinit errormac verify failuremac verify errormac string set errormac setup errormac generation errormac absentkey gen erroriv gen errorinvalid null pkcs12 pointerinvalid null argumenterror setting encrypted data typeencrypt errorencode errordecode errorcant pack structureVERIFY_MACPKCS8_encryptPKCS8_add_keyusagePKCS12_set_macPKCS12_setup_macPKCS12_PBE_keyivgenPKCS12_pbe_cryptPKCS12_parsePKCS12_pack_safebagPKCS12_pack_p7encdataPKCS12_pack_p7dataPKCS12_newpassPKCS12_MAKE_SHKEYBAGPKCS12_MAKE_KEYBAGPKCS12_key_gen_uniPKCS12_key_gen_ascPKCS12_initPKCS12_i2d_encryptPKCS12_gen_macPKCS12_decrypt_d2iPKCS12_createPKCS12_add_localkeyidPKCS12_add_friendlyname_uniPKCS12_add_friendlyname_ascPKCS12_ADD_FRIENDLYNAMEPARSE_BAGSuser too longunknown optionunknown extension nameunknown extensionunknown bit string argumentunable to get issuer keyidunable to get issuer detailsodd number of digitsno subject detailsno policy identifierno issuer detailsno issuer certificateno config databaseneed organization and numbersmissing valueissuer decode errorinvalid syntaxinvalid sectioninvalid policy identifierinvalid optioninvalid object identifierinvalid numbersinvalid numberinvalid null valueinvalid null nameinvalid nameinvalid extension stringinvalid boolean stringillegal hex digitextension value errorextension setting not supportedextension not foundextension name errorextension existsexpected a section nameerror in extensionerror creating extensionerror converting zoneduplicate zone idbn to asn1 integer errorbn dec2bn errorbad objectbad ip addressX509_PURPOSE_setX509_PURPOSE_addX509V3_parse_listX509V3_get_value_boolX509V3_EXT_i2dX509V3_EXT_confX509V3_EXT_add_aliasX509V3_EXT_addX509V3_add_valueX509V3_ADD_I2DV3_GENERIC_EXTENSIONv2i_GENERAL_NAMESv2i_GENERAL_NAMEV2I_EXT_KUV2I_CRLDV2I_BASIC_CONSTRAINTSV2I_AUTHORITY_KEYIDV2I_ASN1_BIT_STRINGV2I_ACCESS_DESCRIPTIONSXNET_get_id_ulongSXNET_get_id_ascSXNET_add_id_ulongSXNET_add_id_INTEGERSXNET_ADD_ASCstring_to_hexS2I_S2I_SKEY_IDS2I_ASN1_SKEY_IDs2i_ASN1_OCTET_STRINGs2i_ASN1_INTEGERS2I_ASN1_IA5STRINGR2I_CERTPOLPOLICY_SECTIONNREF_NOSNOTICE_SECTIONI2V_AUTHORITY_INFO_ACCESSi2s_ASN1_INTEGERi2s_ASN1_ENUMERATEDhex_to_stringDO_EXT_I2DDO_EXT_CONFCOPY_ISSUERCOPY_EMAILwrong pkcs7 typewrong content typeunsupported content typeunsupported cipher typeunknown operationunknown digest typeunable to find message digestunable to find mem biounable to find certificatesmime text errorsig invalid mime typepkcs7 sig parse errorpkcs7 parse errorpkcs7 datasignpkcs7 datafinal errorpkcs7 add signature erroroperation not supported on this typeno sig content typeno signersno signatures on datano recipient matches certificateno multipart boundaryno multipart body failureno content typemissing ceripend infomime sig parse errormime parse errormime no content typeinvalid null pointerinvalid mime typeerror setting ciphererror adding recipientdigest failuredecrypt errordecrypted key is wrong lengthcontent and data presentcipher not initializedcipher has no object identifierSMIME_textSMIME_read_PKCS7PKCS7_verifyPKCS7_simple_smimecapPKCS7_signatureVerifyPKCS7_signPKCS7_set_typePKCS7_set_contentPKCS7_set_cipherPKCS7_get0_signersPKCS7_encryptPKCS7_decryptPKCS7_dataVerifyPKCS7_DATASIGNPKCS7_dataInitPKCS7_dataDecodePKCS7_ctrlPKCS7_add_signerPKCS7_add_recipient_infoPKCS7_add_crlPKCS7_add_certificatePKCS7_add_attrib_smimecapB64_WRITE_PKCS7B64_READ_PKCS7WSAStartupwrite to read only BIOunsupported methodunable to listen socketunable to create socketunable to bind sockettag mismatchnull parameterno such fileno port specifiedno port definedno hostname specifiedno accept port specifiednbio connect errorkeepalivein useinvalid ip addressgethostbyname addr is not af ineterror setting nbio on accept socketerror setting nbio on accepted socketerror setting nbioEOF on memory BIOconnect errorbroken pipebad hostname lookupbad fopen modeaccept errorWSASTARTUPMEM_WRITEMEM_READLINEBUFFER_CTRLFILE_READFILE_CTRLCONN_STATECONN_CTRLBUFFER_CTRLBIO_writeBIO_sock_initBIO_readBIO_putsBIO_nwrite0BIO_nwriteBIO_nread0BIO_nreadBIO_new_mem_bufBIO_new_fileBIO_newBIO_MAKE_PAIRBIO_get_portBIO_get_host_ipBIO_get_accept_socketBIO_getsBIO_gethostbynameBIO_ctrlBIO_BER_GET_HEADERBIO_acceptACPT_STATEunknown orderundefined generatorslot fullpoint is not on curvepoint at infinitynot initializedinvalid forminvalid fieldinvalid encodinginvalid compression bitinvalid compressed pointincompatible objectsbuffer too smallGFP_MONT_GROUP_SET_CURVE_GFPEC_POINT_set_to_infinityEC_POINT_set_Jprojective_coordinates_GFpEC_POINT_set_compressed_coordinates_GFpEC_POINT_set_affine_coordinates_GFpEC_POINT_point2octEC_POINT_oct2pointEC_POINT_newEC_POINT_make_affineEC_POINT_is_on_curveEC_POINT_is_at_infinityEC_POINT_get_Jprojective_coordinates_GFpEC_POINT_get_affine_coordinates_GFpEC_POINT_dblEC_POINT_copyEC_POINT_cmpEC_POINT_addEC_POINTs_mulEC_POINTs_make_affineEC_GROUP_set_generatorEC_GROUP_set_extra_dataEC_GROUP_set_curve_GFpEC_GROUP_precompute_multEC_GROUP_newEC_GROUP_get_orderEC_GROUP_get_curve_GFpEC_GROUP_get_cofactorEC_GROUP_get0_generatorEC_GROUP_copyec_GFp_simple_set_compressed_coordinates_GFpec_GFp_simple_point_set_affine_coordinates_GFpec_GFp_simple_point_get_affine_coordinates_GFpec_GFp_simple_points_make_affineec_GFp_simple_point2octec_GFp_simple_oct2pointec_GFp_simple_make_affineec_GFp_simple_group_set_generatorec_GFp_simple_group_set_curve_GFpec_GFp_mont_field_sqrec_GFp_mont_field_mulec_GFp_mont_field_encodeec_GFp_mont_field_decodeCOMPUTE_WNAFno dynlock create callbackINT_NEW_EX_DATAINT_FREE_EX_DATAINT_DUP_EX_DATADEF_GET_CLASSDEF_ADD_INDEXCRYPTO_set_ex_dataCRYPTO_get_new_lockidCRYPTO_get_new_dynlockidCRYPTO_get_ex_new_indexvariable has no valueunknown module nameunable to create new sectionno valueno sectionno conf or environment variableno confno close bracemodule initialization errormissing init functionmissing finish functionmissing equal signmissing close square bracketerror loading dsoSTR_COPYNCONF_newNCONF_load_fpNCONF_load_bioNCONF_loadNCONF_get_stringNCONF_get_sectionNCONF_get_number_eNCONF_get_numberNCONF_dump_fpNCONF_dump_bioMODULE_RUNMODULE_LOAD_DSOMODULE_INITCONF_modules_loadCONF_load_fpCONF_load_bioCONF_loadCONF_dump_fpwrong typewrong tagunsupported public key typeunsupported encryption algorithmunsupported any defined by typeunknown public key typeunknown object typeunknown message digest algorithmunknown formatunexpected eocunable to decode rsa private keyunable to decode rsa keytype not constructedtoo longthe asn1 object identifier is not known for this mdtag value too highstring too shortstring too longshort linesequence not constructedsequence length mismatchsecond number too largeprivate key header missingodd number of charsnull is wrong lengthno matching choice typenot enough datanon hex charactersmstring wrong tagmstring not universalmissing second numbermissing eoclength erroriv too largeinvalid utf8stringinvalid universalstring lengthinvalid time formatinvalid separatorinvalid digitinvalid bmpstring lengthinteger too large for longillegal tagged anyillegal options on item templateillegal optional anyillegal nullillegal charactersheader too longfirst num too largefield missingexplicit tag not constructedexplicit length mismatchexpecting a timeexpecting a booleanexpecting an objectexpecting an integererror setting cipher paramserror parsing set elementerror loading sectionerror getting timedecoding errordata is wrongboolean is wrong lengthbad tagbad password readbad object headerbad classaux erroradding objectX509_PKEY_newX509_NEWX509_NAME_NEWX509_INFO_newX509_CRL_add0_revokedX509_CINF_NEWPKCS5_pbe2_setOID_MODULE_INITLONG_C2Ii2d_RSA_PUBKEYi2d_PublicKeyi2d_PrivateKeyi2d_Netscape_RSAi2d_DSA_PUBKEYI2D_ASN1_TIMEd2i_X509_PKEYD2I_X509_NAMED2I_X509_CINFD2I_X509d2i_PublicKeyd2i_PrivateKeyD2I_NETSCAPE_RSA_2d2i_Netscape_RSAD2I_ASN1_UTCTIMEd2i_ASN1_UINTEGERd2i_ASN1_type_bytesd2i_ASN1_SETd2i_ASN1_OBJECTD2I_ASN1_INTEGERd2i_ASN1_HEADERD2I_ASN1_GENERALIZEDTIMEd2i_ASN1_bytesd2i_ASN1_BOOLEAND2I_ASN1_BIT_STRINGCOLLECT_DATABN_to_ASN1_INTEGERBN_to_ASN1_ENUMERATEDASN1_verifyASN1_unpack_stringASN1_TYPE_get_octetstringASN1_TYPE_get_int_octetstringASN1_TIME_setASN1_TEMPLATE_NEWASN1_TEMPLATE_EX_D2IASN1_TEMPLATE_D2IASN1_STRING_type_newASN1_STRING_TABLE_addASN1_signASN1_seq_unpackASN1_seq_packASN1_PBE_SETASN1_pack_stringASN1_OBJECT_newASN1_mbstring_copyASN1_item_newASN1_ITEM_EX_D2IASN1_INTEGER_to_BNASN1_INTEGER_setASN1_i2d_fpASN1_i2d_bioASN1_HEADER_newASN1_get_objectASN1_ENUMERATED_to_BNASN1_ENUMERATED_setASN1_dupASN1_DO_ADBASN1_d2i_fpASN1_D2I_EX_PRIMITIVEASN1_d2i_bioASN1_COLLECTASN1_COLLATE_PRIMITIVEASN1_CHECK_TLENa2i_ASN1_STRINGa2i_ASN1_INTEGERa2i_ASN1_ENUMERATEDa2d_ASN1_OBJECTwrong lookup typeunsupported algorithmunknown trust idunknown purpose idunknown key typeunable to get certs public keyunable to find parameters in chainshould retryno cert set for us to verifyloading defaultsloading cert dirkey values mismatchkey type mismatchinvalid field nameinvalid directoryerr asn1 libcert already in hash tablecant check dh keybase64 decode errorbad x509 filetypeX509_verify_certX509_TRUST_setX509_TRUST_addX509_to_X509_REQX509_STORE_CTX_purpose_inheritX509_STORE_CTX_newX509_STORE_CTX_initX509_STORE_add_crlX509_STORE_add_certX509_REQ_to_X509X509_REQ_print_fpX509_REQ_printX509_PUBKEY_setX509_PUBKEY_getX509_print_fpX509_NAME_printX509_NAME_onelineX509_NAME_ENTRY_set_objectX509_NAME_ENTRY_create_by_txtX509_NAME_ENTRY_create_by_NIDX509_NAME_add_entryX509_load_crl_fileX509_load_cert_fileX509_load_cert_crl_fileX509_get_pubkey_parametersX509_EXTENSION_create_by_OBJX509_EXTENSION_create_by_NIDX509_check_private_keyX509_ATTRIBUTE_set1_dataX509_ATTRIBUTE_get0_dataX509_ATTRIBUTE_create_by_txtX509_ATTRIBUTE_create_by_OBJX509_ATTRIBUTE_create_by_NIDX509_ADD_ATTRX509v3_add_extNETSCAPE_SPKI_b64_encodeNETSCAPE_SPKI_b64_decodeGET_CERT_BY_SUBJECTDIR_CTRLBY_FILE_CTRLADD_CERT_DIRmissing parametersdata too large for key sizeSIG_CBi2d_DSA_SIGDSA_verifyDSA_SIG_newDSA_sign_setupDSA_signDSA_print_fpDSA_printDSA_new_methodDSA_do_verifyDSA_do_signDSAparams_print_fpDSAparams_printd2i_DSA_SIGunsupported encryptionshort headerread keypublic key no rsaproblems getting passwordno start linenot proc typenot encryptednot dek infoerror converting private keybad iv charsbad end linebad decryptbad base64 decodePEM_X509_INFO_write_bioPEM_X509_INFO_read_bioPEM_X509_INFO_readPEM_write_bio_PKCS8PrivateKeyPEM_write_bioPEM_writePEM_SignFinalPEM_SealInitPEM_SealFinalPEM_read_bioPEM_readPEM_get_EVP_CIPHER_INFOPEM_F_PEM_WRITE_PKCS8PRIVATEKEYPEM_F_DO_PK8KEY_FPPEM_do_headerPEM_ASN1_write_bioPEM_ASN1_writePEM_ASN1_read_bioPEM_ASN1_readLOAD_IVDEF_CALLBACKd2i_PKCS8PrivateKey_fpd2i_PKCS8PrivateKey_bioOBJ_nid2snOBJ_nid2objOBJ_nid2lnOBJ_dupOBJ_createBUF_strdupBUF_MEM_newBUF_MEM_growwrong public key typewrong final block lengthunsupported salt typeunsupported private key algorithmunsupported prfunsupported key sizeunsupported key derivation functionunsupported keylengthunsuported number of roundsunknown pbe algorithmpkcs8 unknown broken typeno verify function configuredno sign function configuredno dsa parametersno digest setno cipher setkeygen failureinvalid key lengthinput not initializedinitialization errorexpecting a dsa keyexpecting a dh keyexpecting an rsa keyevp pbe cipherinit errordifferent key typesdata not multiple of block lengthctrl operation not implementedctrl not implementedcipher parameter errorbn pubkey errorbn decode errorbad key lengthbad block lengthRC5_CTRLRC2_MAGIC_TO_METHPKCS5_v2_PBE_keyivgenPKCS5_PBE_keyivgenEVP_VerifyFinalEVP_SignFinalEVP_RIJNDAELEVP_PKEY_newEVP_PKEY_get1_RSAEVP_PKEY_get1_DSAEVP_PKEY_get1_DHEVP_PKEY_encryptEVP_PKEY_decryptEVP_PKEY_copy_parametersEVP_PKEY2PKCS8EVP_PKCS8_SET_BROKENEVP_PKCS82PKEYEVP_PBE_CipherInitEVP_PBE_alg_addEVP_OpenInitEVP_MD_CTX_copyEVP_EncryptFinalEVP_DigestInitEVP_DecryptFinalEVP_CIPHER_CTX_set_key_lengthEVP_CIPHER_CTX_ctrlEVP_CipherInitD2I_PKEYno private valuebad generatorDH_new_methodDH_generate_parametersDH_generate_keyDH_compute_keyDHparams_print_fpDHparams_printunknown padding typeunknown algorithm typesslv3 rollback attackrsa operations not supportedq not primep not primepadding check failedoaep decoding errorn does not equal p qnull before block missingkey size too smalliqmp not inverse of qinvalid message lengthd e not congruent to 1dmq1 not congruent to ddmp1 not congruent to ddigest too big for rsa keydata too small for key sizedata too smalldata too large for modulusdata too largedata greater than mod lenblock type is not 02block type is not 01bad pad byte countbad fixed header decryptbad e valuealgorithm mismatchRSA_verify_ASN1_OCTET_STRINGRSA_verifyRSA_sign_ASN1_OCTET_STRINGRSA_signRSA_print_fpRSA_printRSA_padding_check_SSLv23RSA_padding_check_PKCS1_type_2RSA_padding_check_PKCS1_type_1RSA_padding_check_PKCS1_OAEPRSA_padding_check_noneRSA_padding_add_SSLv23RSA_padding_add_PKCS1_type_2RSA_padding_add_PKCS1_type_1RSA_padding_add_PKCS1_OAEPRSA_padding_add_noneRSA_NULLRSA_new_methodRSA_generate_keyRSA_EAY_PUBLIC_ENCRYPTRSA_EAY_PUBLIC_DECRYPTRSA_EAY_PRIVATE_ENCRYPTRSA_EAY_PRIVATE_DECRYPTRSA_check_keyMEMORY_LOCKtoo many temporary variablestoo many iterationsp is not primeno inversenot a squareinvalid rangeinvalid lengthinput not reducedexpand on static bignum dataencoding errordiv by zerocalled with even modulusbignum too longbad reciprocalarg2 lt arg3BN_usubBN_rand_rangeBN_randBN_newBN_mpi2bnBN_mod_sqrtBN_mod_mul_reciprocalBN_mod_lshift_quickBN_mod_inverseBN_mod_exp_mont_wordBN_mod_exp_montBN_mod_exp2_montBN_EXPAND_INTERNALbn_expand2BN_divBN_CTX_newBN_CTX_getBN_bn2hexBN_bn2decBN_BLINDING_updateBN_BLINDING_newBN_BLINDING_invertBN_BLINDING_convert.\crypto\pem\pem_oth.c0123456789ABCDEFPEM part of OpenSSL 0.9.7c 30 Sep 2003.\crypto\pem\pem_lib.cphrase is too short, needs to be at least %d chars Enter PEM pass phrase:ENCRYPTEDDEK-Info: Expecting: TRUSTED CERTIFICATEX509 CERTIFICATEProc-Type: -----END ----- -----BEGIN ÝE¸~F@zB•<™F°íARGxRGÔRGNETSCAPE_CERT_SEQUENCE/usr/local/ssl/certs/usr/local/ssl/cert.pemSSL_CERT_DIRSSL_CERT_FILE.\crypto\asn1\x_info.c.\crypto\pem\pem_info.cniv <= EVP_MAX_IV_LENGTH.\crypto\evp\evp_key.cnkey <= EVP_MAX_KEY_LENGTH.\crypto\evp\encode.cn < sizeof ctx->enc_data.\crypto\pkcs12\p12_decr.c.\crypto\asn1\x_pkey.c.\crypto\ui\ui_lib.cYou must type in to charactersOpenSSL default user interfaceVerify failure Verifying - %scon.\crypto\ui\ui_openssl.cW|WÌWÒWÄGetProcAddressÂLoadLibraryAuGetVersionExAmGetTickCountQueryPerformanceCounterúGetCurrentThreadIdqSetLastErrorKERNEL32.dll¿_strdupà_utime_isattyÞ_filenoº_stat‚_mkdirŽ_accessÁ_stricmpÅ_strnicmp÷_getch‡_open³_close˜_readD_lseekî_fstat¯signal©FlushConsoleInputBuffer during intense changing, be aware. This is for us who like email... Please direct curl questions, feature requests and trouble reports to one of these mailing lists instead of mailing any individual. Using the curl functions in PHP. Everything curl with a PHP angle. Or PHP with a curl angle. curl-commits Receives notifications on all CVS commits done to the curl source module. This can become quite a large amount of mails during intense development, be aware. This is for us who like email... curl-www-commits Receives notifications on all CVS commits done to the curl www module (basicly the web site). This can become quite a large amount of mails its development and things relevant to this. Get all info at http://curl.haxx.se/mail/. The lists available are: curl-users Users of the command line tool. How to use it, what doesn't work, new features, related tools, questions, news, installations, compilations, running, porting etc. curl-library Developers using or developing libcurl. Bugs, extensions, improvements. curl-announce Low-traffic. Only announcements of new public versions. curl-and-PHP Note that curl cannot use persistant connections for transfers that are used in subsequence curl invokes. Try to stuff as many URLs as possible on the same command line if they are using the same host, as that'll make the transfers faster. If you use a http proxy for file transfers, practicly all transfers will be persistant. Persistant connections were introduced in curl 7.7. MAILING LISTS For your convenience, we have several open mailing lists to discuss curl, Specifying multiple files on a single command line will make curl transfer all of them, one after the other in the specified order. libcurl will attempt to use persistant connections for the transfers so that the second transfer to the same host can use the same connection that was already initiated and was left open in the previous transfer. This greatly decreases connection time for all but the first transfer and it makes a far better use of the network. curl -tTTYPE=vt100 telnet://remote.server.com Other interesting options for it -t include: - XDISPLOC= Sets the X display location. - NEW_ENV= Sets an environment variable. NOTE: the telnet protocol does not specify any way to login with a specified user and password so curl can't do that automatically. To do that, you need to track when the login prompt is received and send the username and password accordingly. PERSISTANT CONNECTIONS server using a command line similar to: curl telnet://remote.server.com And enter the data to pass to the server on stdin. The result will be sent to stdout or to the file you specify with -o. You might want the -N/--no-buffer option to switch off the buffered output for slow connections or similar. Pass options to the telnet protocol negotiation, by using the -t option. To tell the server we use a vt100 terminal, try something like: First, get the krb-ticket the normal way, like with the kauth tool. Then use curl in way similar to: curl --krb4 private ftp://krb4site.com -u username:fakepwd There's no use for a password on the -u switch, but a blank one will make curl ask for one and you already entered the real password to kauth. TELNET The curl telnet support is basic and very easy to use. Curl passes all data passed to it on stdin to the remote server. Connect to a remote telnet curl, the -w/--write-out option was introduced. Using this, you can specify what information from the previous transfer you want to extract. To display the amount of bytes downloaded together with some text and an ending newline: curl -w 'We downloaded %{size_download} bytes\n' www.download.com KERBEROS4 FTP TRANSFER Curl supports kerberos4 for FTP transfers. You need the kerberos package installed and used at curl build time for it to be used. only readable by yourself (curl doesn't care though). Curl supports .netrc files if told so (using the -n/--netrc and --netrc-optional options). This is not restricted to only ftp, but curl can use it for all protocols where authentication is used. A very simple .netrc file could look something like: machine curl.haxx.se login iamdaniel password mysecret CUSTOM OUTPUT To better allow script programmers to get to know about the progress of The usage of the -x/--proxy flag overrides the environment variables. NETRC Unix introduced the .netrc concept a long time ago. It is a way for a user to specify name and password for commonly visited ftp sites in a file so that you don't have to type them in each time you visit those sites. You realize this is a big security risk if someone else gets hold of your passwords, so therefor most unix programs won't read this file unless it is http_proxy, HTTPS_PROXY, FTP_PROXY, GOPHER_PROXY They should be set for protocol-specific proxies. General proxy should be set with ALL_PROXY A comma-separated list of host names that shouldn't go through any proxy is set in (only an asterisk, '*' matches all hosts) NO_PROXY If a tail substring of the domain-path for a host matches one of these strings, transactions with that node will not be proxied. RFC 2255, "The LDAP URL Format" http://www.rfc-editor.org/rfc/rfc2255.txt To show you an example, this is now I can get all people from my local LDAP server that has a certain sub-domain in their email address: curl -B "ldap://ldap.frontec.se/o=frontec??sub?mail=*sth.frontec.se" If I want the same info in HTML format, I can get it by not using the -B (enforce ASCII) flag. ENVIRONMENT VARIABLES Curl reads and understands the following environment variables: If you have installed the OpenLDAP library, curl can take advantage of it and offer ldap:// support. LDAP is a complex thing and writing an LDAP query is not an easy task. I do advice you to dig up the syntax description for that elsewhere. Two places that might suit you are: Netscape's "Netscape Directory SDK 3.0 for C Programmer's Guide Chapter 10: Working with LDAP URLs": http://developer.netscape.com/docs/manuals/dirsdk/csdk30/url.htm curl dict://dict.org/d:daniel:web1913 Aliases for 'm' are 'match' and 'find', and aliases for 'd' are 'define' and 'lookup'. For example, curl dict://dict.org/find:curl Commands that break the URL description of the RFC (but not the DICT protocol) are curl dict://dict.org/show:db curl dict://dict.org/show:strat Authentication is still missing (but this is not required by the RFC) LDAP curl -z -local.html http://remote.server.com/remote.html You can specify a "free text" date as condition. Tell curl to only download the file if it was updated since yesterday: curl -z yesterday http://remote.server.com/remote.html Curl will then accept a wide range of date formats. You always make the date check the other way around by prepending it with a dash '-'. DICT For fun try curl dict://dict.org/m:curl curl dict://dict.org/d:heisenbug:jargon requests. It is If-Modified-Since or If-Unmodified-Since. Curl allow you to specify them with the -z/--time-cond flag. For example, you can easily make a download that only gets performed if the remote file is newer than a local copy. It would be made like: curl -z local.html http://remote.server.com/remote.html Or you can download a file only if the local file is newer than the remote one. Do this by prepending the date string with a '-', as in: curl -C - -T file ftp://ftp.server.com/path/file Continue downloading a document from a web server(*2): curl -C - -o file http://www.server.com/ (*1) = This requires that the ftp server supports the non-standard command SIZE. If it doesn't, curl will say so. (*2) = This requires that the web server supports at least HTTP/1.1. If it doesn't, curl will say so. TIME CONDITIONS HTTP allows a client to specify a time condition for the document it Run the 'openssl' application to convert the certificate. If you cd to the openssl installation, you can do it like: # ./apps/openssl pkcs12 -in [file you saved] -clcerts -out [PEMfile] RESUMING FILE TRANSFERS To continue a file transfer where it was previously aborted, curl supports resume on http(s) downloads as well as ftp uploads and downloads. Continue downloading a document: curl -C - -o file ftp://ftp.server.com/path/file Continue uploading a document(*1): To use OpenSSL to convert your favourite browser's certificate into a PEM formatted one that curl can use, do something like this (assuming netscape, but IE is likely to work similarly): You start with hitting the 'security' menu button in netscape. Select 'certificates->yours' and then pick a certificate in the list Press the 'export' button enter your PIN code for the certs select a proper place to save it prompted for the correct password before any data can be received. Many older SSL-servers have problems with SSLv3 or TLS, that newer versions of OpenSSL etc is using, therefore it is sometimes useful to specify what SSL-version curl should use. Use -3, -2 or -1 to specify that exact SSL version to use (for SSLv3, SSLv2 or TLSv1 respectively): curl -2 https://secure.site.com/ Otherwise, curl will first attempt to use v3 and then v2. N. Henson has written a patch for SSLeay that adds this functionality. You can get his patch (that requires an SSLeay installation) from his site at: http://www.drh-consultancy.demon.co.uk/ Example on how to automatically retrieve a document using a certificate with a personal password: curl -E /path/to/cert.pem:password https://secure.site.com/ If you neglect to specify the password on the command line, you will be store certificates with, but it is not used by the most commonly used browsers (Netscape and MSIE both use the so called PKCS#12 format). If you want curl to use the certificates you use with your (favourite) browser, you may need to download/compile a converter that can convert your browser's formatted certificates to PEM formatted ones. This kind of converter is included in recent versions of OpenSSL, and for older versions Dr Stephen Secure HTTP requires SSL libraries to be installed and used when curl is built. If that is done, curl is capable of retrieving and posting documents using the HTTPS procotol. Example: curl https://www.secure-site.com Curl is also capable of using your personal certificates to get/post files from sites that require valid certificates. The only drawback is that the certificate needs to be in PEM-format. PEM is a standard and open format to Download with PORT but use the IP address of our 'le0' interface (this does not work on windows): curl -P le0 ftp.download.com Download with PORT but use 192.168.0.10 as our IP address to use: curl -P 192.168.0.10 ftp.download.com NETWORK INTERFACE Get a web page from a server using a specified port for the interface: curl --interface eth0:1 http://www.netscape.com/ or curl --interface 192.168.1.10 http://www.netscape.com/ HTTPS other way to do it is to use the PORT command and instruct the server to connect to the client on the given (as parameters to the PORT command) IP number and port. The -P flag to curl supports a few different options. Your machine may have several IP-addresses and/or network interfaces and curl allows you to select which of them to use. Default address can also be used: curl -P - ftp.download.com The default way for curl is to issue the PASV command which causes the server to open another port and await another connection performed by the client. This is good if the client is behind a firewall that don't allow incoming connections. curl ftp.download.com If the server for example, is behind a firewall that don't allow connections on other ports than 21 (or if it just doesn't support the PASV command), the curl ftp://user:passwd@my.site.com/README But if you want the README file from the root directory of that very same site, you need to specify the absolute file name: curl ftp://user:passwd@my.site.com//README (I.e with an extra slash in front of the file name.) FTP and firewalls The FTP protocol requires one of the involved parties to open a second connction as soon as data is about to get transfered. There are two ways to do this. header than it normally does. The -H header you specify then replaces the header curl would normally send. If you replace an internal header with an empty one, you prevent that header from being sent. To prevent the Host: header from being used: curl -H "Host:" www.server.com FTP and PATH NAMES Do note that when getting files with the ftp:// URL, the given path is relative the directory you enter. To get the file 'README' from your home directory at your ftp site, do: tables etc: echo "user = user:passwd" | curl -K - http://that.secret.site.com EXTRA HEADERS When using curl in your own very special programs, you may end up needing to pass on your own custom headers when getting a web page. You can do this by using the -H flag. Example, send the header "X-you-and-me: yes" to the server when getting a page: curl -H "X-you-and-me: yes" www.love.com This can also be useful in case you want curl to send a different text in a line parameter, like: curl -q www.thatsite.com Force curl to get and display a local help page in case it is invoked without URL by making a config file similar to: # default url to get url = "http://help.with.curl.com/curlhelp.html" You can specify another config file to be read by using the -K/--config flag. If you set config file name to "-" it'll read the config from stdin, which can be handy if you want to hide options from being visible in process NOTE: You must specify options and their arguments on the same line. Example, set default time out and proxy in a config file: # We want a 30 minute timeout: -m 1800 # ... and we use a proxy for all accesses: proxy = proxy.our.domain.com:8080 White spaces ARE significant at the end of lines, but all white spaces leading up to the first characters of each line are ignored. Prevent curl from reading the default file by using -q as the first command can also specify the long options without the dashes to make it more readable. You can separate the options and the parameter with spaces, or with = or :. Comments can be used within the file. If the first letter on a line is a '#'-letter the rest of the line is treated as a comment. If you want the parameter to contain spaces, you must inclose the entire parameter within double quotes ("). Within those quotes, you specify a quote as \". When using the --limit-rate option, the transfer rate is regulated on a per-second basis, which will cause the total transfer speed to become lower than the given number. Sometimes of course substantially lower, if your transfer stalls during periods. CONFIG FILE Curl automatically tries to read the .curlrc file (or _curlrc file on win32 systems) from the user's home dir on startup. The config file could be made up with normal command line switches, but you which might be useful if you're using a limited bandwidth connection and you don't want your transfer to use all of it (sometimes referred to as "bandwith throttle"). Make curl transfer data no faster than 10 kilobytes per second: curl --limit-rate 10K www.far-away-site.com or curl --limit-rate 10240 www.far-away-site.com Or prevent curl from uploading data faster than 1 megabyte per second: curl -T upload --limit-rate 1M ftp://uploadshereplease.com To have curl abort the download if the speed is slower than 3000 bytes per second for 1 minute, run: curl -Y 3000 -y 60 www.far-away-site.com This can very well be used in combination with the overall time limit, so that the above operatioin must be completed in whole within 30 minutes: curl -m 1800 -Y 3000 -y 60 www.far-away-site.com Forcing curl not to transfer data faster than a given rate is also possible, 5 seconds of a transfer is based on less time of course.) The -# option will display a totally different progress bar that doesn't need much explanation! SPEED LIMIT Curl allows the user to set the transfer speed conditions that must be met to let the transfer keep going. By using the switch -y and -Y you can make curl abort transfers if the transfer speed is below the specified lowest limit for a specified time. Xferd - currently uploaded amount of bytes Average Speed Dload - the average transfer speed of the download Average Speed Upload - the average transfer speed of the upload Time Total - expected time to complete the operation Time Current - time passed since the invoke Time Left - expected time left to completetion Curr.Speed - the average transfer speed the last 5 seconds (the first Dload Upload Total Current Left Speed 0 151M 0 38608 0 0 9406 0 4:41:43 0:00:04 4:41:39 9287 From left-to-right: % - percentage completed of the whole transfer Total - total size of the whole expected transfer % - percentage completed of the download Received - currently downloaded amount of bytes % - percentage completed of the upload Alas, to both read and write cookies from a netscape cookie file, you can set both -b and -c to use the same file: curl -b cookies.txt -c cookies.txt www.example.com PROGRESS METER The progress meter exists to show a user that something actually is happening. The different fields in the output have the following meaning: % Total % Received % Xferd Average Speed Time Curr. curl -L -b empty.txt www.example.com The file to read cookies from must be formatted using plain HTTP headers OR as netscape's cookie file. Curl will determine what kind it is based on the file contents. In the above command, curl will parse the header and store the cookies received from www.example.com. curl will send to the server the stored cookies which match the request as it follows the location. The file "empty.txt" may be a non-existant file. however error-prone and not the prefered way to do this. Instead, make curl save the incoming cookies using the well-known netscape cookie format like this: curl -c cookies.txt www.example.com Note that by specifying -b you enable the "cookie awareness" and with -L you can make curl follow a location: (which often is used in combination with cookies). So that if a site sends cookies and a location, you can use a non-existing file to trigger the cookie awareness like: Curl also has the ability to use previously received cookies in following sessions. If you get cookies from a server and store them in a file in a manner similar to: curl --dump-header headers www.example.com ... you can then in a second connect to that (or another) site, use the cookies from the 'headers' file like: curl -b headers www.example.com While saving headers to a file is a working way to store cookies, it is ("domain=NAME") and if it should be used on secure connections only ("secure"). If you've received a page from a server that contains a header like: Set-Cookie: sessionid=boo123; path="/foo"; it means the server wants that first pair passed on when we get anything in a path beginning with "/foo". Example, get a page that wants my name passed in a cookie: curl -b "name=Daniel" www.sillypage.com client's side. The server sets cookies by sending a response line in the headers that looks like 'Set-Cookie: ' where the data part then typically contains a set of NAME=VALUE pairs (separated by semicolons ';' like "NAME1=VALUE1; NAME2=VALUE2;"). The server can also specify for what path the "cookie" should be used for (by specifying "path=value"), when the cookie should expire ("expire=DATE"), for what domain to use it 'Mozilla/4.05 [en] (X11; U; Linux 2.0.32 i586)' NS for Linux Note that Internet Explorer tries hard to be compatible in every way: 'Mozilla/4.0 (compatible; MSIE 4.01; Windows 95)' MSIE for W95 Mozilla is not the only possible User-Agent name: 'Konqueror/1.0' KDE File Manager desktop client 'Lynx/2.7.1 libwww-FM/2.14' Lynx command line browser COOKIES Cookies are generally used by web servers to keep state information at the line. It is especially useful to fool or trick stupid servers or CGI scripts that only accept certain browsers. Example: curl -A 'Mozilla/3.0 (Win95; I)' http://www.nationsbank.com/ Other common strings: 'Mozilla/3.0 (Win95; I)' Netscape Version 3 for Windows 95 'Mozilla/3.04 (Win95; U)' Netscape Version 3 for Windows 95 'Mozilla/2.02 (OS/2; U)' Netscape Version 2 for OS/2 'Mozilla/4.04 [en] (X11; U; AIX 4.2; Nav)' NS for AIX referrer to be used on the command line. It is especially useful to fool or trick stupid servers or CGI scripts that rely on that information being available or contain certain data. curl -e www.coolsite.com http://www.showme.com/ NOTE: The referer field is defined in the HTTP spec to be a full URL. USER AGENT A HTTP request has the option to include information about the browser that generated the request. Curl allows it to be specified on the command http://www.post.com/postit.cgi To send two files in one post you can do it in two ways: 1. Send multiple files in a single "field" with a single field name: curl -F "pictures=@dog.gif,cat.gif" 2. Send two fields with two field names: curl -F "docpicture=@dog.gif" -F "catpicture=@cat.gif" REFERRER A HTTP request has the option to include information about which address that referred to actual page. Curl allows you to specify the field is a file description. We want to post the file we have written named "cooltext.txt". To let curl do the posting of this data instead of your favourite browser, you have to read the HTML source of the form page and find the names of the input fields. In our example, the input field names are 'file', 'yourname' and 'filedescription'. curl -F "file=@cooltext.txt" -F "yourname=Daniel" \ -F "filedescription=Cool text file with cool text inside" \ If the content-type is not specified, curl will try to guess from the file extension (it only knows a few), or use the previously specified type (from an earlier file if several files are specified in a list) or else it will using the default type 'text/plain'. Emulate a fill-in form with -F. Let's say you fill in three fields in a form. One field is a file name which to post, one field is your name and one be read from a file, use <@filename> as contents. When specifying a file, you can also specify the file content type by appending ';type=' to the file name. You can also post the contents of several files in one field. For example, the field name 'coolfiles' is used to send three files, with different content types using the following syntax: curl -F "coolfiles=@fil1.gif;type=image/gif,fil2.txt,fil3.html" \ http://www.post.com/postit.cgi curl -d "user=foobar&pass=12345&id=blablabla&ding=submit" (continues) http://www.formpost.com/getthis/post.cgi While -d uses the application/x-www-form-urlencoded mime-type, generally understood by CGI's and similar, curl also supports the more capable multipart/form-data type. This latter type supports things like file upload. -F accepts parameters like -F "name=contents". If you want the contents to the letter's ASCII code. Example: (page located at http://www.formpost.com/getthis/
We want to enter user 'foobar' with password '12345'. To post to this, you enter a curl command line like: If there's a "normal" post, you use -d to post. -d takes a full "post string", which is in the format =&=&... The 'variable' names are the names set with "name=" in the tags, and the data is the contents you want to fill in for the inputs. The data *must* be properly URL encoded. That means you replace space with + and that you write weird letters with %XX where XX is the hexadecimal representation of It's easy to post data using curl. This is done using the -d option. The post data must be urlencoded. Post a simple "name" and "phone" guestbook. curl -d "name=Rafael%20Sagula&phone=3320780" \ http://www.where.com/guest.cgi How to post a form with curl, lesson #1: Dig out all the tags in the form that you want to fill in. (There's a perl program called formfind.pl on the curl site that helps with this). -D/--dump-header option when getting files from both FTP and HTTP, and it will then store the headers in the specified file. Store the HTTP headers in a separate file (headers.txt in the example): curl --dump-header headers.txt curl.haxx.se Note that headers stored in a separate file can be very useful at a later time if you want curl to use cookies sent by the server. More about that in the cookies section. POST (HTTP) DETAILED INFORMATION Different protocols provide different ways of getting detailed information about specific files/documents. To get curl to show detailed information about a single file, you should use -I/--head option. It displays all available info on a single file for HTTP and FTP. The HTTP information is a lot more extensive. For HTTP, you can get the header information (the same as -I would show) shown before the data by using -i/--include. Curl understands the if you can't understand the responses: use the -v flag to get verbose fetching. Curl will output lots of info and what it sends and receives in order to let the user see all client-server interaction (but it won't show you the actual data). curl -v ftp://ftp.upload.com/ To get even more details and information on what curl does, try using the --trace or --trace-ascii options with a given file name to log to, like this: curl --trace trace.txt www.haxx.se curl --proxytunnel -x proxy:port -T localfile ftp.upload.com HTTP Upload all data on stdin to a specified http site: curl -T - http://www.upload.com/myfile Note that the http server must've been configured to accept PUT before this can be done successfully. For other ways to do http data upload, see the POST section below. VERBOSE / DEBUG If curl fails where it isn't supposed to, if the servers don't let you in, Upload a local file to the remote site, and use the local file name remote too: curl -T uploadfile -u user:passwd ftp://ftp.upload.com/ Upload a local file to get appended to the remote file using ftp: curl -T localfile -a ftp://ftp.upload.com/remotefile Curl also supports ftp upload through a proxy, but only if the proxy is configured to allow that kind of tunneling. If it does, you can run curl in a fashion similar to: Curl also supports simple ranges for FTP files as well. Then you can only specify start and stop position. Get the first 100 bytes of a document using FTP: curl -r 0-99 ftp://www.get.this/README UPLOADING FTP Upload all data on stdin to a specified ftp site: curl -T - ftp://ftp.upload.com/myfile Upload data from a specified file, login with user and password: curl -T uploadfile -u user:passwd ftp://ftp.upload.com/myfile See also the environment variables Curl support that offer further proxy control. RANGES With HTTP 1.1 byte-ranges were introduced. Using this, a client can request to get only one or more subparts of a specified document. Curl supports this with the -r flag. Get the first 100 bytes of a document: curl -r 0-99 http://www.get.this/ Get the last 500 bytes of a document: curl -r -500 http://www.get.this/ Get an ftp file using a proxy named my-proxy that uses port 888: curl -x my-proxy:888 ftp://ftp.leachsite.com/README Get a file from a HTTP server that requires user and password, using the same proxy as above: curl -u user:passwd -x my-proxy:888 http://www.get.this/ Some proxies require special authentication. Specify by using -U as above: curl -U user:passwd -x my-proxy:888 http://www.get.this/ or specify user and password separately like in curl -u name:passwd http://machine.domain/full/path/to/file NOTE! Since HTTP URLs don't support user and password, you can't use that style when using Curl via a proxy. You _must_ use the -u style fetch during such circumstances. HTTPS Probably most commonly used with private certificates, as explained below. GOPHER Curl features no password support for gopher. PROXY To ftp files using name+passwd, include them in the URL like: curl ftp://name:passwd@machine.domain:port/full/path/to/file or specify them with the -u flag like curl -u name:passwd ftp://machine.domain:port/full/path/to/file HTTP The HTTP URL doesn't support user and password in the URL string. Curl does support that anyway to provide a ftp-style interface and thus you can pick a file like: curl http://name:passwd@machine.domain/full/path/to/file Get a web page and store in a local file: curl -o thatpage.html http://www.netscape.com/ Get a web page and store in a local file, make the local file get the name of the remote document (if no file name part is specified in the URL, this will fail): curl -O http://www.netscape.com/index.html Fetch two files and store them with their remote names: curl -O www.haxx.se/index.html -O curl.haxx.se/download.html USING PASSWORDS FTP Get a web page from a server using port 8000: curl http://www.weirdserver.com:8000/ Get a list of a directory of an FTP site: curl ftp://cool.haxx.se/ Get a gopher document from funet's gopher server: curl gopher://gopher.funet.fi Get the definition of curl from a dictionary: curl dict://dict.org/m:curl Fetch two documents at once: curl ftp://cool.haxx.se/ http://www.weirdserver.com:8000/ DOWNLOAD TO A FILE ftp://ftp.sunet.se/pub/www/utilities/curl/ SEE ALSO ftp(1), wget(1), snarf(1) LATEST VERSION You always find news about what's going on as well as the latest versions from the curl web pages, located at: http://curl.haxx.se SIMPLE USAGE Get the main page from netscape's web-server: curl http://www.netscape.com/ Get the README file the user's home directory at funet's ftp-server: curl ftp://ftp.funet.fi/README 61 Unrecognized transfer encoding 62 Invalid LDAP URL 63 Maximum file size exceeded XX There will appear more error codes here in future releases. The existing ones are meant to never change. AUTHORS / CONTRIBUTORS Daniel Stenberg is the main author, but the whole list of contributors is found in the separate THANKS file. WWW http://curl.haxx.se FTP 52 The server didn't reply anything, which here is considered an error. 53 SSL crypto engine not found 54 Cannot set SSL crypto engine as default 55 Failed sending network data 56 Failure in receiving network data 57 Share is in use (internal error) 58 Problem with the local certificate 59 Couldn't use specified SSL cipher 60 Problem with the CA cert (path? permission?) 45 Interface error. A specified outgoing interface could not be used. 46 Bad password entered. An error was signaled when the password was entered. 47 Too many redirects. When following redirects, curl hit the maximum amount. 48 Unknown TELNET option specified. 49 Malformed telnet option. 51 The remote peer's SSL certificate wasn't ok 40 Library not found. The LDAP library was not found. 41 Function not found. A required LDAP function was not found. 42 Aborted by callback. An application told curl to abort the operation. 43 Internal error. A function was called with a bad parameter. 44 Internal error. A function was called in a bad order. 34 HTTP post error. Internal post-request generation error. 35 SSL connect error. The SSL handshaking failed. 36 FTP bad download resume. Couldn't continue an ear- lier aborted download. 37 FILE couldn't read file. Failed to open the file. Permissions? 38 LDAP cannot bind. LDAP bind operation failed. 39 LDAP search failed. FTP servers support the PORT command, try doing a transfer using PASV instead! 31 FTP couldn't use REST. The REST command failed. This command is used for resumed FTP transfers. 32 FTP couldn't use SIZE. The SIZE command failed. The command is an extension to the original FTP spec RFC 959. 33 HTTP range error. The range "command" didn't work. operation, used for FTP uploading. 26 Read error. Various reading problems. 27 Out of memory. A memory allocation request failed. 28 Operation timeout. The specified time-out period was reached according to the conditions. 29 FTP couldn't set ASCII. The server returned an unknown reply. 30 FTP PORT failed. The PORT command failed. Not all 22 HTTP page not retrieved. The requested url was not found or returned another error with the HTTP error code being 400 or above. This return code only appears if --fail is used. 23 Write error. Curl couldn't write data to a local filesystem or similar. 24 Malformed user. User name badly specified. 25 FTP couldn't STOR file. The server denied the STOR 17 FTP couldn't set binary. Couldn't change transfer method to binary. 18 Partial file. Only a part of the file was trans- fered. 19 FTP couldn't download/access the given file, the RETR (or similar) command failed. 20 FTP write error. The transfer was reported bad by the server. 21 FTP quote error. A quote command returned error from the server. sent to the USER request. 13 FTP weird PASV reply, Curl couldn't parse the reply sent to the PASV request. 14 FTP weird 227 format. Curl couldn't parse the 227-line the server sent. 15 FTP can't get host. Couldn't resolve the host IP we got in the 227-line. 16 FTP can't reconnect. Couldn't connect to the host we got in the 227-line. 7 Failed to connect to host. 8 FTP weird server reply. The server sent data curl couldn't parse. 9 FTP access denied. The server denied login. 10 FTP user/password incorrect. Either one or both were not accepted by the server. 11 FTP weird PASS reply. Curl couldn't parse the reply sent to the PASS request. 12 FTP weird USER reply. Curl couldn't parse the reply 1 Unsupported protocol. This build of curl has no support for this protocol. 2 Failed to initialize. 3 URL malformat. The syntax was not correct. 4 URL user malformatted. The user-part of the URL syntax was not correct. 5 Couldn't resolve proxy. The given proxy host could not be resolved. 6 Couldn't resolve host. The given remote host was not resolved. Sets proxy server to use if no protocol-specific proxy is set. NO_PROXY list of host names that shouldn't go through any proxy. If set to a asterisk EXIT CODES There exists a bunch of different error codes and their corresponding error messages that may appear during bad conditions. At the time of this writing, the exit codes are: Default config file. ENVIRONMENT http_proxy [protocol://][:port] Sets proxy server to use for HTTP. HTTPS_PROXY [protocol://][:port] Sets proxy server to use for HTTPS. FTP_PROXY [protocol://][:port] Sets proxy server to use for FTP. GOPHER_PROXY [protocol://][:port] Sets proxy server to use for GOPHER. ALL_PROXY [protocol://][:port] multiple IP versions (which it is if it is ipv6-capable), this option tells libcurl to resolve names to IPv6 addresses only. (Added in 7.10.8) -#/--progress-bar Make curl display progress information as a progress bar instead of the default statistics. If this option is used twice, the second will again disable the progress bar. FILES ~/.curlrc (HTTPS) Forces curl to use SSL version 3 when nego- tiating with a remote SSL server. -4/--ipv4 If libcurl is capable of resolving an address to multiple IP versions (which it is if it is ipv6-capable), this option tells libcurl to resolve names to IPv4 addresses only. (Added in 7.10.8) -6/--ipv6 If libcurl is capable of resolving an address to (HTTP) Forces curl to issue its requests using HTTP 1.0 instead of using its internally preferred: HTTP 1.1. -1/--tlsv1 (HTTPS) Forces curl to use TSL version 1 when nego- tiating with a remote TLS server. -2/--sslv2 (HTTPS) Forces curl to use SSL version 2 when nego- tiating with a remote SSL server. -3/--sslv3 If this option is used several times, the last one will be used. -Z/--max-redirs Set maximum number of redirection-followings allowed. If -L/--location is used, this option can be used to prevent curl from following redirections "in absurdum". If this option is used several times, the last one will be used. -0/--http1.0 match any internal ones, it tries to get the time from a given file name instead! See the GNU date(1) or curl_getdate(3) man pages for date expression details. Start the date expression with a dash (-) to make it request for a document that is older than the given date/time, default is a document that is newer than the specified date/time. aborted. speed-time is set with -Y and is 30 if not set. If this option is used several times, the last one will be used. -z/--time-cond (HTTP) Request to get a file that has been modified later than the given time and date, or one that has been modified before that time. The date expression can be all sorts of date strings or if it doesn't This option controls transfers and thus will not affect slow connects etc. If this is a concern for you, try the --connect-timeout option. If this option is used several times, the last one will be used. -Y/--speed-limit If a download is slower than this given speed, in bytes per second, for speed-time seconds it gets of LIST when doing file lists with ftp. If this option is used several times, the last one will be used. -y/--speed-time