;ELC ;;; Compiled ;;; in Emacs version 28.0.50 ;;; with all optimizations. (byte-code "\300\301!\210\300\302!\210\300\303!\210\300\304!\207" [require cl-lib json url url-http] 2) (defvar tern-known-port nil) (defvar tern-server nil) (defvar tern-explicit-port nil) (defvar tern-project-dir nil) (defvar tern-last-file-name nil) (defvar tern-last-project-dir nil) #@26 (fn FMT &rest OBJECTS) (defalias 'tern-message #[385 "\300\301#\207" [apply message] 6 (#$ . 375)]) #@19 (fn PORT DOC C) (defalias 'tern-req #[771 "\306\307\306\310\311!\312\"\306\313\314\315\306\211 \316\306\211\211\211\317\211& \211\320\321C#.\207" [url-mime-charset-string url-request-method deactivate-mark url-request-data url-show-status tern-server nil "POST" encode-coding-string json-encode utf-8 record url "http" "/" t url-http tern-req-finished url-current-object] 17 (#$ . 485)]) #@10 (fn C) (defalias 'tern-req-finished #[257 "\211:\205 \211@\303=\304\305\306\307#\306\310\307!\210\204\211\204J\211\205$\311`d\"\312\313\n!\210\314p!\210\2038AA\2029\205@A@B\306\")\262\202Z\315 \313\n!\210\314p!\210\306\"\262)\207" [deactivate-mark url-callback-function url-http-process :error search-forward "\n\n" nil t set-buffer-multibyte buffer-substring-no-properties ignore delete-process kill-buffer json-read] 7 (#$ . 894)]) (defalias 'tern-project-dir #[0 "\302 \232\203 \204Z\302 \204\303\211\204Z\304\302 !\3052X\306\307\211\203(\2028\304\310!!\211GGW\2056\211\262\262\205U\311\312\313\"!\203O\314\305\211\262\"\210\306\262\202 \266\2020\210\302  \207" [tern-last-file-name tern-project-dir buffer-file-name "" file-name-directory --cl-block-nil-- nil t directory-file-name file-exists-p expand-file-name ".tern-project" throw] 7]) (defalias 'tern-known-port #[0 "\302 \232\203 \207\302 \303\211\207" [tern-last-project-dir tern-known-port tern-project-dir nil] 2]) #@32 (fn C &optional IGNORE-PORT) (defalias 'tern-find-server #[513 "\3032k\302 \203!\304\303\302 :\203\305\302 A\"\202\302 \305\"\"\210\203,\305\"\202j\305\306\307\310 \"\311!\203d\312\313\314\315\"r\211q\210\316\317\"\216\320!\210\321 *\262!\211=\204c\211\304\303\305\"\"\210\210)\266\322!0\207" [tern-explicit-port deactivate-mark tern-known-port --cl-block-nil-- throw nil expand-file-name ".tern-port" tern-project-dir file-exists-p string-to-number generate-new-buffer " *temp*" t make-closure #[0 "\301\300!\205 \302\300!\207" [V0 buffer-name kill-buffer] 2] insert-file-contents buffer-string tern-start-server] 10 (#$ . 1934)]) #@334 Location of the tern server binary command and options. This is a quoted list of strings representing the command and optional arguments to run the Tern server. Examples: (setq tern-command '("/home/jane/.nvm/versions/node/v10.13.0/bin/tern")) (setq tern-command '("/home/jane/.nvm/versions/node/v10.13.0/bin/tern" "--strip-crs")) (defvar tern-command (byte-code "\206\304\301!\203 \206\n\305\306\307\310!!\"\311!\203* \312=\203'\313D\207\211C\207\314C\207" [load-file-name bytecomp-filename buffer-file-name system-type boundp expand-file-name "../bin/tern" file-name-directory file-truename file-exists-p windows-nt "node" "tern"] 6) (#$ . 2604)) #@10 (fn C) (defalias 'tern-start-server #[257 "\302 \303 \235\203 \202\304 \305\"\306\307\310\311$\312C\313\311\"\210\314\315\316$\"\210\317\315\320#\")\207" [default-directory tern-command tern-project-dir "--strip-crs" append ("--strip-crs") apply start-process "Tern" nil "" set-process-query-on-exit-flag set-process-sentinel make-closure #[514 "\304\301!\210\305\306\302\242PB\307\310\311\312p$\210\300\311\303 \"\207" [V0 V1 V2 tern-known-port delete-process :failed "Could not start Tern server\n" run-at-time "30 sec" nil #[257 "r\211q\210\300 :\205 \301\211)\207" [tern-known-port nil] 3 "\n\n(fn BUF)"]] 7 "\n\n(fn PROC EVENT)"] set-process-filter #[514 "\303\304\"\204\301\211\242P\240\207\305\306\307\"!\310\311\"\210\312\313\"\210\300\302 \313\"\207" [V0 V1 tern-known-port string-match "Listening on port \\([0-9][0-9]*\\)" string-to-number match-string 1 set-process-sentinel #[514 "\301!\210\302\211\207" [tern-known-port delete-process nil] 4 "\n\n(fn PROC EVENT)"] set-process-filter nil] 6 "\n\n(fn PROC OUTPUT)"]] 11 (#$ . 3273)]) (defvar tern-command-generation 0) (defvar tern-activity-since-command -1) (defvar tern-last-point-pos nil) (defvar tern-last-completions nil) (defvar tern-last-argument-hints nil) (defvar tern-buffer-is-dirty nil) (defalias 'tern-project-relative-file #[0 "\300 \203 \300 \301 G\302O\207\303 \207" [buffer-file-name tern-project-dir nil buffer-name] 3]) #@11 (fn AT) (defalias 'tern-get-partial-file #[257 "\300\211\211\301\302Z]\212b\210\3032B\304\305\306#\204\307\303\300\"\210\310 \311 \203,W\203/\262\211b\210\211X\203=\307\303\300\"\210\266\202\210\211b\210\311 \262)\212\312\\d^b\210\311 \211X\203a\313 \202b\211\262\210)\314\315\316 B\317SB\320\321\"BF\207" [nil 0 2000 --cl-block-nil-- re-search-backward "\\bfunction\\b" t throw current-indentation line-beginning-position 1000 line-end-position (type . "part") name tern-project-relative-file offset text buffer-substring-no-properties] 12 (#$ . 4715)]) (defalias 'tern-modified-sibling-buffers #[0 "\300\301 \211\203D\211@\211p=\204=\302\303\"\203=\302\304\"\203=\305 rq\210\305 )\232\203=r\211q\210\306\307\310 B\311\312 BEB\262)A\266\202\202\210\211\237\207" [nil buffer-list buffer-local-value tern-mode tern-buffer-is-dirty tern-project-dir (type . "full") name tern-project-relative-file text buffer-string] 7]) #@14 (fn F DOC) (defalias 'tern-run-request #[514 "p\300C\300C\300C\301\302$\240\210\211\301\303%\240\210\304\242!\207" [nil make-closure #[514 "\203\3031\304\301\302\242#0\207\302\242C\305\"\207\300\305\"\207" [V0 V1 V2 (error) tern-req nil] 6 "\n\n(fn PORT ERR)"] #[514 "r\301q\210\203<\302\242\204<@A@\306=\204@@\307=\203<\302\310\240\210\304 \311 \2032\303\242\311\"\2027\312\303\242\"\262\202@\300\")\207" [V0 V1 V2 V3 tern-known-port tern-explicit-port connection-failed file-error t nil tern-find-server] 6 "\n\n(fn ERR DATA)"] tern-find-server] 13 (#$ . 5686)]) #@35 (fn F QUERY POS &optional MODE) (defalias 'tern-run-query #[1027 ";\203 \302BC\262T\211\303BC\304=\205\305 C\306 \204)\307 \262\202c\304=\204O\310 \311V\203O\312!\242B\240\210\313\262\211\314\242@\236AZ\262\202c\315\316\317 B\320\307 BE\242B\240\210\307 \262\242\203s\321\322\323\242\"BB\262\324B\303\236\211AB\241\266\325SB\303\236\211AB\241\266\326\327\330   %\"\207" [tern-command-generation tern-buffer-is-dirty type query :full-file tern-modified-sibling-buffers nil tern-project-relative-file buffer-size 8000 tern-get-partial-file "#0" offset (type . "full") text buffer-string name files apply vector file end tern-run-request make-closure #[514 "\f\302W\205B\2047\303\242\211\2032\211@\306\236A\307\232\203+r\310\311\312\236A\313 \"!q\210\314)A\266\202\202\f\210\300!\207\301\315=?\205B\316\317\"\207" [V0 V1 V2 V3 tern-activity-since-command tern-buffer-is-dirty type "full" find-file-noselect expand-file-name name tern-project-dir nil :silent tern-message "Request failed: %s"] 8 "\n\n(fn ERR DATA)"]] 16 (#$ . 6299)]) (defalias 'tern-send-buffer-to-server #[0 "\300 \205\301\302\303\304\305\306\307 B\310\311 BE!BC\"\207" [buffer-file-name tern-run-request #[514 "\300\207" [nil] 3 "\n\n(fn ERR DATA)"] files vector (type . "full") name tern-project-relative-file text buffer-string] 8]) (defalias 'tern-completion-at-point-fn #[0 "\300\301\302`#\207" [tern-run-query tern-do-complete ((type . "completions") (includeKeywords . t))] 4]) (defalias 'tern-completion-at-point #[0 "\300 \206\301\207" [tern-completion-matches-last tern-completion-at-point-fn] 1]) #@13 (fn DATA) (defalias 'tern-do-complete #[257 "\302\236A\303\304\211T\211\262\203#GW\203#H\262B\262\202\211\237\266\204\305\236AT\306\236AT\307\"F\304\310#)\207" [tern-last-completions completion-in-region-mode-predicate completions -1 nil start end buffer-substring-no-properties completion-in-region] 8 (#$ . 7945)]) (defalias 'tern-completion-matches-last #[0 "\205\236\211G\302U\203\211A\262\242\202\303\304\305GD\"\211A\262\242\211A\262\242\242dX\205\234\306\"\232\205\234`U\203BA\207`Y\205\234`\307\\X\205\234\310\306`\"\311\312\313#)\266\203\205\234\306`\"`\311\211:\203\225@\262\314\n\315\fG \315G&\312=\203\216B\262A\262\202l\211\237\266\203E\262\266\205\207" [tern-last-completions inhibit-changing-match-data 4 signal wrong-number-of-arguments (word start end list) buffer-substring-no-properties 50 "^[a-zA-Z0-9_$]*$" nil t string-match compare-strings 0] 18]) #@14 millisecond. (defvar tern-update-argument-hints-timer 500 (#$ . 8906)) #@75 [internal] If non-nil, `tern-update-argument-hints' will be called later. (defvar tern-update-argument-hints-async nil (#$ . 8983)) (defalias 'tern-update-argument-hints-async #[0 "\203\302!\210\303\304 _\305\306#\211\207" [tern-update-argument-hints-async tern-update-argument-hints-timer cancel-timer run-at-time 0.001 nil #[0 "\3011 \302 0\210\202\303\304\"\266\305\211\207" [tern-update-argument-hints-async (t) tern-update-argument-hints message "tern-update-argument-hints : %S" nil] 4]] 4]) (defalias 'tern-update-argument-hints #[0 "\301 A@\211\205&\211f\302=\205&\203@=\203\303 \207\304\305\306\"\307\310$\207" [tern-last-argument-hints syntax-ppss 40 tern-show-argument-hints tern-run-query make-closure #[257 "\302!\211\205 \300B\303 \207" [V0 tern-last-argument-hints tern-parse-function-type tern-show-argument-hints] 4 "\n\n(fn DATA)"] ((type . "type") (preferFunction . t)) :silent] 6]) #@18 (fn END-CHARS) (defalias 'tern-skip-matching-brackets #[257 "\300`\301\\\3022k`dW\203i`f\300X\203%\303\"\203%\304\302\305\"\210\202b\211\306=\2047\211\307=\2047\211\310=\203>S\262\202b\211\311=\204P\211\312=\204P\211\313=\203WT\262\202b`V\203b\304\302\314\"\210\314u\266\202\3140\207" [0 500 --cl-block-nil-- cl-find throw t 41 93 125 40 91 123 nil] 7 (#$ . 9917)]) #@13 (fn DATA) (defalias 'tern-parse-function-type #[257 "\302\236A\303\236A\206\304\236A\206\305\306\307\306\310\311#)\266\203\205\202\312\313\310\"r\211q\210\314\315\"\216c\210\316b\210\306\211`f\317=\204k\320\321!\205N\322\225b\210\323\324!`\325\326!\210`{BB\262\266`f\327=\203:\330u\210\202:\320\331!\203x`\332\\d{\262\237E\266\202*\262)\207" [deactivate-mark inhibit-changing-match-data type exprName name "fn" nil "^fn(" t string-match generate-new-buffer " *temp*" make-closure #[0 "\301\300!\205 \302\300!\207" [V0 buffer-name kill-buffer] 2] 4 41 looking-at "\\([a-zA-Z0-9_$?]*\\):\\s-*" 0 match-string 1 tern-skip-matching-brackets (41 44) 44 2 ") -> " 5] 11 (#$ . 10316)]) #@14 (fn START) (defalias 'tern-find-current-arg #[257 "`\300\\W\205>\212`Tb\210\3012;\302\303\304!`Y\203!\305\301\"\210\211\203+\306\307!\2030\305\301\310\"\210\311u\266\211T\262\202\262)\207" [500 --cl-block-nil-- 0 tern-skip-matching-brackets (41 44) throw looking-at ")" nil 1] 7 (#$ . 11035)]) (defalias 'tern-show-argument-hints #[0 "\211\203\211A\262\242\202\302\303\304GD\"\305\306!\211G\307U\203*\211A\262\242\2021\302\303\310GD\"\211A\262\242\242\311\312\313#C\262\314B\262\305\315:\203\236@\262\211\315U\204_\316 B\262 @\206e\317 =\203t\311\312\320#\202u\211\nB\262\n\210A\317\232\204\223\321 B\262 \311A\312\322# B\262 A\262\211T\262\202J\266\323B\262\211\203\272\324B\262\311\312\322#B\262\266\305\325\326\327\237\"!)\207" [tern-last-argument-hints message-log-max signal wrong-number-of-arguments (paren . type) nil tern-find-current-arg 3 (name args ret) propertize face font-lock-function-name-face "(" 0 ", " "?" highlight ": " font-lock-type-face ")" " -> " tern-message apply concat] 16]) #@13 (fn DATA) (defalias 'tern-do-refactor #[257 "\300p\301\236A\302\300T\211\262\203AGW\203AH\262\303\304\236A\"\211\2045\304\236AC\262\211B\262\211\211AB\241\266\202\266\300\211:\203\233@\262\211A\262\242\262\305\306\"\262\307\310\311 \"!\210\300:\203\222@\262\312\236AT\313\236AT|\210\212b\210\314\236Ac\210)\266A\262\202g\266A\262\202F\266\315!\207" [nil changes -1 assoc-string file sort #[514 "\300\236A\300\236AV\207" [start] 5 "\n\n(fn A B)"] find-file expand-file-name tern-project-dir start end text switch-to-buffer] 12 (#$ . 12122)]) #@17 (fn NEW-NAME) (defalias 'tern-rename-variable #[257 "\300\301\302\303BD`\304$\207" [tern-run-query tern-do-refactor (type . "rename") newName :full-file] 6 (#$ . 12730) "MNew variable name: "]) #@48 Delay before the highlight overlay disappears. (defvar tern-flash-timeout 0.5 (#$ . 12933)) #@65 Temporarily highlight region from START to END. (fn START END) (defalias 'tern-flash-region #[514 "\301\"\302\303\304#\210\305\306\307$\207" [tern-flash-timeout make-overlay overlay-put face highlight run-with-timer nil delete-overlay] 8 (#$ . 13031)]) #@13 (fn DATA) (defalias 'tern-do-highlight #[257 "\301\236A\302\303T\211\262\203<GW\203<H\262\304\236A\305\306 \"\230\2038\307\236AT\310\236AT\311\"\266\210\202\303\207" [buffer-file-name refs -1 nil file expand-file-name tern-project-dir start end tern-flash-region] 10 (#$ . 13296)]) (defalias 'tern-highlight-refs #[0 "\300\301\302`#\207" [tern-run-query tern-do-highlight "refs"] 4 nil nil]) (defvar tern-find-definition-stack nil) #@13 (fn DATA) (defalias 'tern-show-definition #[257 "\301\236A\211\205\302\301\236A\303 \"\211\262\205\304\"\211\2038\305 `BB\306\233\211\2032\211\211\307\241\266\210\310\"\207\311\236A\211\203D\312!\207\313\314!\207" [tern-find-definition-stack file expand-file-name tern-project-dir tern-find-position buffer-file-name 20 nil tern-go-to-position url browse-url tern-message "No definition found."] 7 (#$ . 13757)]) (defalias 'tern-at-interesting-expression #[0 "\300`\301\"\302>?\205\303\304`S]`Td^\"\305\306\"\262\207" [get-text-property face (font-lock-comment-face font-lock-comment-delimiter-face font-lock-string-face) buffer-substring-no-properties 1 string-match "\\sw\\|)\\|]\\|_"] 4]) #@29 (fn &optional PROMPT-VAR) (defalias 'tern-find-definition #[256 "\211\204\n\300 ?\205 \301\302!\303 \210\304\305\306\307BD`#\207" [tern-at-interesting-expression read-from-minibuffer "Variable: " push-mark tern-run-query tern-show-definition (type . "definition") variable] 7 (#$ . 14481) nil]) (defalias 'tern-find-definition-by-name #[0 "\300\301!\207" [tern-find-definition t] 2 nil nil]) #@18 (fn FILE DATA) (defalias 'tern-find-position #[514 "r\300!q\210\301\236AT\211\302\236AZ\303\236AG\\dX\203.\304\"\232\203.\266\204\202s\305\211\212eb\210\3062d\307\305\310#\204E\311\306\305\"\210`GZ\312Z!\203Y\211W\203_\262\211\262\266\2028\210)\205qZ\\\266\206)\207" [find-file-noselect start contextOffset context buffer-substring-no-properties nil --cl-block-nil-- search-forward t throw abs] 12 (#$ . 14884)]) (defalias 'tern-pop-find-definition #[0 "\205#\211A\242\211\203\211A\262\242\202\301\302\303GD\"\304\"\266\202\207" [tern-find-definition-stack signal wrong-number-of-arguments (file . pos) tern-go-to-position] 5 nil nil]) #@17 (fn FILE POS) (defalias 'tern-go-to-position #[514 "\301!\210\211d^b\210`\211\207" [tern-last-point-pos find-file] 4 (#$ . 15578)]) (defalias 'tern-get-type #[0 "\300\301\302`#\207" [tern-run-query #[257 "\300\301\236A\206 \302!\207" [tern-message type "Not found"] 4 "\n\n(fn DATA)"] "type"] 4 nil nil]) (defvar tern-last-docs-url nil) (defalias 'tern-get-docs #[0 "\203 \302=\203\303!\210\304\211\207\305\306\307`#\207" [tern-last-docs-url last-command tern-get-docs browse-url nil tern-run-query #[257 "\301\236A\302\236A\211\203\303!\207\203\304!\207\303\305!\207" [tern-last-docs-url url doc tern-message browse-url "Not found"] 5 "\n\n(fn DATA)"] "documentation"] 4 nil nil]) #@20 (fn PORT SERVER) (defalias 'tern-use-server #[514 "\303\211\304\230\203\305\202\211\211\207" [tern-explicit-port tern-known-port tern-server nil "" "127.0.0.1"] 4 (#$ . 16290) "nPort to connect to: \nsServer: "]) #@58 Track changes to the buffer. (fn START END PREV-LENGTH) (defalias 'tern-after-change #[771 "\203@^A]B\202B \211\207" [tern-buffer-is-dirty tern-command-generation tern-activity-since-command] 6 (#$ . 16519)]) #@86 The time Emacs is allowed to idle before updating Tern's representation of the file. (defvar tern-idle-time 2.5 (#$ . 16749)) #@49 The timer on which `tern-reparse-on-idle' runs. (defvar tern-idle-timer nil (#$ . 16881)) #@72 Do some mode plumbing and refresh tern's representation of the buffer. (defalias 'tern-reparse-on-idle #[0 "\205-\305\n\203 \203 @\n@X\203\305\f\203+ \203+ @\fA@X\203+\305\306 \207" [tern-mode tern-last-point-pos tern-last-argument-hints tern-buffer-is-dirty tern-last-completions nil tern-send-buffer-to-server] 2 (#$ . 16977)]) (defalias 'tern-post-command #[0 "`=?\205 ` \303 \207" [tern-last-point-pos tern-command-generation tern-activity-since-command tern-update-argument-hints-async] 2]) (defalias 'tern-left-buffer #[0 "\205\302\303 @!?\205\304\211\305 )\207" [tern-buffer-is-dirty buffer-list-update-hook buffer-file-name buffer-list nil tern-send-buffer-to-server] 3]) (defvar tern-mode-keymap (make-sparse-keymap)) (byte-code "\301\302\303#\210\301\304\305#\210\301\306\307#\210\301\310\311#\210\301\312\313#\210\301\314\315#\207" [tern-mode-keymap define-key [(meta 46)] tern-find-definition [(control meta 46)] tern-find-definition-by-name [(meta 44)] tern-pop-find-definition [(control 99) (control 114)] tern-rename-variable [(control 99) (control 99)] tern-get-type [(control 99) (control 100)] tern-get-docs] 4) #@87 Non-nil if Tern mode is enabled. Use the command `tern-mode' to change this variable. (defvar tern-mode nil (#$ . 18144)) (make-variable-buffer-local 'tern-mode) #@594 Minor mode binding to the Tern JavaScript analyzer This is a minor mode. If called interactively, toggle the `Tern mode' mode. If the prefix argument is positive, enable the mode, and if it is zero or negative, disable the mode. If called from Lisp, toggle the mode if ARG is `toggle'. Enable the mode if ARG is nil, omitted, or is a positive number. Disable the mode if ARG is a negative number. To check whether the minor mode is enabled in the current buffer, evaluate `tern-mode'. The mode's hook is called both when the mode is enabled and when it is disabled. (fn &optional ARG) (defalias 'tern-mode #[256 "\302 \303=\203 ?\202\247\203\304W\203\305\202\306\307\301!\2031\310\300 \"\2031\300 B\203;\311 \210\202>\312 \210\313\314\203H\315\202I\316\"\210\317\320!\203k\302 \203]\211\302 \232\203k\321\322\203g\323\202h\324\325#\210\210\326 \210\207" [tern-mode local-minor-modes current-message toggle 1 nil t boundp delq tern-mode-enable tern-mode-disable run-hooks tern-mode-hook tern-mode-on-hook tern-mode-off-hook called-interactively-p any message "Tern mode %sabled%s" "en" "dis" " in current buffer" force-mode-line-update] 6 (#$ . 18313) (byte-code "\203\n\301!\202 \302C\207" [current-prefix-arg prefix-numeric-value toggle] 2)]) (defvar tern-mode-hook nil) (byte-code "\301\302N\204\f\303\301\302\304#\210\303\301\305\306#\210\303\301\307\310C#\210\311\312\313\310\211%\207" [tern-mode-keymap tern-mode-hook variable-documentation put "Hook run after entering or leaving `tern-mode'.\nNo problems result if this variable is not bound.\n`add-hook' automatically binds it. (This is true for all hook variables.)" custom-type hook standard-value nil add-minor-mode tern-mode " Tern"] 6) (defalias 'tern-mode-enable #[0 "\306\300!\210\307\306\301!\210\310\306\302!\210\307\306\303!\210\307\306\304!\210\307\306\305!\210\307\306\311!\210\307 \306\312!\210\307\n\306\313!\210\307 \306\314!\210\315 \205EedB\f\306\316!\210\317B\320\321\322\307\323$\210\204e\324\323\325#\320\326\327\307\323$\210\320\330\331\307\323$\210\332 \207" [tern-known-port tern-server tern-explicit-port tern-project-dir tern-last-file-name tern-last-project-dir make-local-variable nil "127.0.0.1" tern-last-point-pos tern-last-completions tern-last-argument-hints tern-buffer-is-dirty buffer-modified-p completion-at-point-functions tern-completion-at-point add-hook after-change-functions tern-after-change t run-with-idle-timer tern-reparse-on-idle post-command-hook tern-post-command buffer-list-update-hook tern-left-buffer tern-send-buffer-to-server tern-idle-timer tern-idle-time] 5]) (defalias 'tern-mode-disable #[0 "\302\303\" \203\304 !\210\305\306\307\310\311#\210\306\312\313\311#\210\306\314\315\311#\207" [completion-at-point-functions tern-idle-timer remove tern-completion-at-point cancel-timer nil remove-hook after-change-functions tern-after-change t post-command-hook tern-post-command buffer-list-update-hook tern-left-buffer] 4]) (provide 'tern)