1
0
mirror of https://github.com/sasjs/core.git synced 2025-12-11 14:34:35 +00:00

Compare commits

...

19 Commits

Author SHA1 Message Date
Allan Bowe
7cafb4fb36 Merge pull request #48 from sasjs/base64
feat: adding mp_base64copy macro
2021-06-24 00:30:21 +03:00
Allan Bowe
a8d222a0f8 chore: automated commit 2021-06-24 00:29:54 +03:00
Allan Bowe
ac0ddf38b0 chore: automated commit 2021-06-24 00:28:41 +03:00
Allan Bowe
ecd389c935 feat: adding mp_base64copy macro 2021-06-24 00:26:41 +03:00
Allan Bowe
06a5ea06f8 Merge pull request #46 from sasjs/mendfixes
sasjs lint fix for macro name in MEND statement
2021-06-23 22:27:36 +03:00
Allan Bowe
955471ed3c Merge branch 'main' into mendfixes 2021-06-23 21:55:44 +03:00
Allan Bowe
c8d3b43b12 fix: adding lrecl to mv_createfile to support lines 1 million characters wide. Closes #47 2021-06-23 21:53:32 +03:00
Allan Bowe
3e313b06a9 fix: adding mend in python lua build 2021-06-21 17:25:58 +03:00
Allan Bowe
d7371a4505 fix: adding mend to every macro statement using sasjs lint fix 2021-06-21 17:25:01 +03:00
Allan Bowe
32a6d15c2e Merge pull request #44 from sasjs/vpn-connection
chore: added vpn connection
2021-06-21 14:35:19 +03:00
Allan Bowe
b109e7cead fix: bumping core 2021-06-21 11:27:06 +00:00
d291d3e287 chore: added vpn connection 2021-06-21 11:49:37 +02:00
Allan Bowe
5a2968e798 fix: supporting LATIN1 as well as WLATIN1 in mm_webout 2021-06-17 16:31:29 +03:00
Allan Bowe
120ad9a7da fix: supporting bell cand escape characters when creating viya jobs / services with macro 2021-06-11 00:09:16 +03:00
Allan Bowe
67a81b2690 chore: updating the docs for mm_spkexport.sas 2021-06-08 20:09:23 +03:00
Allan Bowe
506cf1812f fix: deal with dashes in sysencoding 2021-06-08 16:59:43 +03:00
Allan Bowe
8cc0eb0dd7 Merge pull request #42 from sasjs/issue41
closes #42 Issue41
2021-06-03 22:44:16 +03:00
Allan Bowe
3f49925d01 Merge pull request #40 from sasjs/dependabot/npm_and_yarn/ws-7.4.6
chore(deps): bump ws from 7.4.5 to 7.4.6
2021-06-01 17:58:49 +03:00
dependabot[bot]
c51c9c2ca9 chore(deps): bump ws from 7.4.5 to 7.4.6
Bumps [ws](https://github.com/websockets/ws) from 7.4.5 to 7.4.6.
- [Release notes](https://github.com/websockets/ws/releases)
- [Commits](https://github.com/websockets/ws/compare/7.4.5...7.4.6)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-31 02:08:52 +00:00
134 changed files with 2635 additions and 738 deletions

30
.github/vpn/config.ovpn vendored Normal file
View File

@@ -0,0 +1,30 @@
cipher AES-256-CBC
setenv FORWARD_COMPATIBLE 1
client
server-poll-timeout 4
nobind
remote vpn.analytium.co.uk 1194 udp
remote vpn.analytium.co.uk 1194 udp
remote vpn.analytium.co.uk 443 tcp
remote vpn.analytium.co.uk 1194 udp
remote vpn.analytium.co.uk 1194 udp
remote vpn.analytium.co.uk 1194 udp
remote vpn.analytium.co.uk 1194 udp
remote vpn.analytium.co.uk 1194 udp
dev tun
dev-type tun
ns-cert-type server
setenv opt tls-version-min 1.0 or-highest
reneg-sec 604800
sndbuf 0
rcvbuf 0
# NOTE: LZO commands are pushed by the Access Server at connect time.
# NOTE: The below line doesn't disable LZO.
comp-lzo no
verb 3
setenv PUSH_PEER_INFO
ca ca.crt
cert user.crt
key user.key
tls-auth tls.key 1

View File

@@ -21,6 +21,31 @@ jobs:
with:
node-version: ${{ matrix.node-version }}
- name: Write VPN Files
run: |
echo "$CA_CRT" > .github/vpn/ca.crt
echo "$USER_CRT" > .github/vpn/user.crt
echo "$USER_KEY" > .github/vpn/user.key
echo "$TLS_KEY" > .github/vpn/tls.key
shell: bash
env:
CA_CRT: ${{ secrets.CA_CRT}}
USER_CRT: ${{ secrets.USER_CRT }}
USER_KEY: ${{ secrets.USER_KEY }}
TLS_KEY: ${{ secrets.TLS_KEY }}
- name: Install Open VPN
run: |
sudo apt install apt-transport-https
sudo wget https://swupdate.openvpn.net/repos/openvpn-repo-pkg-key.pub
sudo apt-key add openvpn-repo-pkg-key.pub
sudo wget -O /etc/apt/sources.list.d/openvpn3.list https://swupdate.openvpn.net/community/openvpn3/repos/openvpn3-bionic.list
sudo apt update
sudo apt install openvpn3
- name: Start Open VPN 3
run: openvpn3 session-start --config .github/vpn/config.ovpn
- name: Install Doxygen
run: sudo apt-get install doxygen
@@ -31,16 +56,16 @@ jobs:
run: npm run lint
- name: Add client
run: echo "CLIENT=${{secrets.CLIENT}}"> .env.viya
run: echo "CLIENT=${{secrets.CLIENT}}"> .env.viya
- name: Add secret
run: echo "SECRET=${{secrets.SECRET}}" >> .env.viya
run: echo "SECRET=${{secrets.SECRET}}" >> .env.viya
- name: Add access token
run: echo "ACCESS_TOKEN=${{secrets.ACCESS_TOKEN}}" >> .env.viya
run: echo "ACCESS_TOKEN=${{secrets.ACCESS_TOKEN}}" >> .env.viya
- name: Add refresh token
run: echo "REFRESH_TOKEN=${{secrets.REFRESH_TOKEN}}" >> .env.viya
run: echo "REFRESH_TOKEN=${{secrets.REFRESH_TOKEN}}" >> .env.viya
- name: Build Project
run: npm run build

View File

@@ -2,7 +2,7 @@
"noTrailingSpaces": true,
"noEncodedPasswords": true,
"hasDoxygenHeader": true,
"hasMacroNameInMend": false,
"hasMacroNameInMend": true,
"hasMacroParentheses": true,
"noNestedMacros": false,
"noSpacesInFileNames": true,

437
all.sas

File diff suppressed because it is too large Load Diff

View File

@@ -42,6 +42,6 @@
-1
%put &sysmacroname: &feature not found;
%end;
%mend;
%mend mf_existfeature;
/** @endcond */

View File

@@ -24,4 +24,4 @@
0
%end;
%mend;
%mend mf_existfileref;

View File

@@ -30,6 +30,6 @@
%let rc=%sysfunc(close(&dsid));
%end;
%mend;
%mend mf_existvar;
/** @endcond */

View File

@@ -54,6 +54,6 @@
0
%put Vars not found: &found;
%end;
%mend;
%mend mf_existvarlist;
/** @endcond */

View File

@@ -31,4 +31,4 @@
%sysfunc(attrc(&dsid,&attr))
%let rc=%sysfunc(close(&dsid));
%end;
%mend;
%mend mf_getattrc;

View File

@@ -31,4 +31,4 @@
%sysfunc(attrn(&dsid,&attr))
%let rc=%sysfunc(close(&dsid));
%end;
%mend;
%mend mf_getattrn;

View File

@@ -48,6 +48,6 @@
&engine
%mend;
%mend mf_getengine;
/** @endcond */

View File

@@ -44,4 +44,4 @@
%sysfunc(INPUTN(&bytes, best.),sizekmg.)
%end;
%mend ;
%mend mf_getfilesize ;

View File

@@ -29,4 +29,4 @@
&valc
%end;
%else %put %str(ERR)OR: Unable to find key &key in ds &libds;
%mend;
%mend mf_getkeyvalue;

View File

@@ -62,4 +62,4 @@
%else %if &switch=VIYARESTAPI %then %do;
%mf_trimstr(%sysfunc(getoption(servicesbaseurl)),/)
%end;
%mend;
%mend mf_getplatform;

View File

@@ -50,4 +50,4 @@
&buffer
%mend;
%mend mf_getquotedstr;

View File

@@ -38,6 +38,6 @@
&schema
%mend;
%mend mf_getschema;
/** @endcond */

View File

@@ -34,4 +34,4 @@
%end;
%end;
%put unable to find available fileref in range &prefix.0-&maxtries;
%mend;
%mend mf_getuniquefileref;

View File

@@ -37,4 +37,4 @@
%end;
%end;
%put unable to find available libref in range &prefix.0-&maxtries;
%mend;
%mend mf_getuniquelibref;

View File

@@ -39,4 +39,4 @@
%quote(&user)
%mend;
%mend mf_getuser;

View File

@@ -30,4 +30,4 @@
%trim(&&&variable)
%end;
%mend;
%mend mf_getvalue;

View File

@@ -29,4 +29,4 @@
%let rc=%sysfunc(close(&dsid));
%end;
&nvars
%mend;
%mend mf_getvarcount;

View File

@@ -49,4 +49,4 @@
%let rc = %sysfunc(close(&dsid));
/* Return variable format */
&vlen
%mend;
%mend mf_getVarLen;

View File

@@ -51,4 +51,4 @@ returns:
/* Return variable number */
&vnum.
%mend;
%mend mf_getVarNum;

View File

@@ -40,4 +40,4 @@
&engine
%mend;
%mend mf_getxengine;

View File

@@ -24,4 +24,4 @@
%sysevalf(%superq(param)=,boolean)
%mend;
%mend mf_isblank;

View File

@@ -31,4 +31,4 @@
&is_directory
%mend;
%mend mf_isdir;

View File

@@ -26,4 +26,4 @@
&root
%end;
%mend;
%mend mf_loc;

View File

@@ -64,4 +64,4 @@ Usage:
%end;
%end;
/* exit quietly if directory did exist.*/
%mend;
%mend mf_mkdir;

View File

@@ -16,4 +16,4 @@
%if %symexist(&var) %then %do;
%superq(&var)
%end;
%mend;
%mend mf_mval;

View File

@@ -23,4 +23,4 @@
%macro mf_nobs(libds
)/*/STORE SOURCE*/;
%mf_getattrn(&libds,NLOBS)
%mend;
%mend mf_nobs;

View File

@@ -47,4 +47,4 @@
&basestr
%end;
%mend;
%mend mf_trimstr;

View File

@@ -62,4 +62,4 @@
%else %mf_abort(mac=mf_verifymacvars,type=&mabort,msg=&abortmsg);
%exit_success:
%mend;
%mend mf_verifymacvars;

View File

@@ -50,5 +50,5 @@
&outvar
%mend;
%mend mf_wordsInStr1ButNotStr2;

View File

@@ -142,4 +142,4 @@
proc sql;
drop table &ds;
%mend;
%mend mp_assertcols;

View File

@@ -144,4 +144,4 @@
proc sql;
drop table &ds;
%mend;
%mend mp_assertcolvals;

120
base/mp_base64copy.sas Normal file
View File

@@ -0,0 +1,120 @@
/**
@file
@brief Convert a file to/from base64 format
@details Creates a new version of a file either encoded or decoded using
Base64. Inspired by this post by Michael Dixon:
https://support.selerity.com.au/hc/en-us/articles/223345708-Tip-SAS-and-Base64
Usage:
filename tmp temp;
data _null_;
file tmp;
put 'base ik ally';
run;
%mp_base64copy(inref=tmp, outref=myref, action=ENCODE)
data _null_;
infile myref;
input;
put _infile_;
run;
%mp_base64copy(inref=myref, outref=mynewref, action=DECODE)
data _null_;
infile mynewref;
input;
put _infile_;
run;
@param inref= Fileref of the input file (should exist)
@param outref= Output filref. If it does not exist, it is created.
@param action= (ENCODE) The action to take. Valid values:
@li ENCODE Convert the file to base64 format
@li DECODE Decode the file from base64 format
<h4> SAS Macros </h4>
@li mp_abort.sas
@version 9.2
**/
%macro mp_base64copy(
inref=0,
outref=0,
action=ENCODE
)/*/STORE SOURCE*/;
%let inref=%upcase(&inref);
%let outref=%upcase(&outref);
%let action=%upcase(&action);
%local infound outfound;
%let infound=0;
%let outfound=0;
data _null_;
set sashelp.vextfl(where=(fileref="&inref" or fileref="&outref"));
if fileref="&inref" then call symputx('infound',1,'l');
if fileref="&outref" then call symputx('outfound',1,'l');
run;
%mp_abort(iftrue= (&infound=0)
,mac=&sysmacroname
,msg=%str(INREF &inref NOT FOUND!)
)
%mp_abort(iftrue= (&outref=0)
,mac=&sysmacroname
,msg=%str(OUTREF NOT PROVIDED!)
)
%mp_abort(iftrue= (&action ne ENCODE and &action ne DECODE)
,mac=&sysmacroname
,msg=%str(Invalid action! Should be ENCODE OR DECODE)
)
%if &outfound=0 %then %do;
filename &outref temp lrecl=2097088;
%%end;
%if &action=ENCODE %then %do;
data _null_;
length b64 $ 76 line $ 57;
retain line "";
infile &inref recfm=F lrecl= 1 end=eof;
input @1 stream $char1.;
file &outref lrecl=76;
substr(line,(_N_-(CEIL(_N_/57)-1)*57),1) = byte(rank(stream));
if mod(_N_,57)=0 or EOF then do;
if eof then b64=put(trim(line),$base64X76.);
else b64=put(line, $base64X76.);
put b64;
line="";
end;
run;
%end;
%else %if &action=DECODE %then %do;
data _null_;
length filein 8 fileout 8;
filein = fopen("&inref",'I',4,'B');
fileout = fopen("&outref",'O',3,'B');
char= '20'x;
do while(fread(filein)=0);
raw="1234";
do i=1 to 4;
rc=fget(filein,char,1);
substr(raw,i,1)=char;
end;
val="123";
val=input(raw,$base64X4.);
do i=1 to 3;
length byte $1;
byte=byte(rank(substr(val,i,1)));
rc = fput(fileout, byte);
end;
rc =fwrite(fileout);
end;
rc = fclose(filein);
rc = fclose(fileout);
run;
%end;
%mend mp_base64copy;

View File

@@ -53,4 +53,4 @@
%if &outref=____out %then %do;
filename &outref clear;
%end;
%mend;
%mend mp_binarycopy;

View File

@@ -67,5 +67,5 @@
else put inchar $char1.;
end;
run;
%mend;
%mend mp_cleancsv;
/** @endcond */

View File

@@ -64,4 +64,4 @@ data &outds;
output;
run;
%mend;
%mend mp_createconstraints;

View File

@@ -80,4 +80,4 @@ Usage:
)
%end;
%mend;
%mend mp_createwebservice;

View File

@@ -141,4 +141,4 @@ data &outds
%end;
run;
%mend;
%mend mp_csv2ds;

View File

@@ -49,4 +49,4 @@ data &outds;
end;
run;
%mend;
%mend mp_deleteconstraints;

View File

@@ -167,4 +167,4 @@ run;
by filepath file_or_folder filename ext ;
run;
%end;
%mend;
%mend mp_dirlist;

View File

@@ -47,4 +47,4 @@
%end;
as &outvar length=&varlen
from &libds;
%mend;
%mend mp_distinctfmtvalues;

View File

@@ -251,4 +251,4 @@ quit;
%put NOTE-;%put NOTE-;
%put NOTE- %sysfunc(dequote(&cards_file.));
%put NOTE-;%put NOTE-;
%mend;
%mend mp_ds2cards;

View File

@@ -55,4 +55,4 @@ data _null_;
run;
%mend;
%mend mp_ds2csv;

View File

@@ -99,4 +99,4 @@ filename &outref temp;
run;
%end;
%mend;
%mend mp_filtergenerate;

View File

@@ -57,4 +57,4 @@ create table &outds as
%end;
;
%mend;
%mend mp_getconstraints;

View File

@@ -332,4 +332,4 @@ run;
run;
%end;
%mend;
%mend mp_getdbml;

View File

@@ -115,7 +115,7 @@ create table _data_ as
end;
run;
%put &=constraints_used;
%mend;
%mend addConst;
data _null_;
file &fref;
@@ -378,4 +378,4 @@ run;
run;
%end;
%mend;
%mend mp_getddl;

View File

@@ -70,4 +70,4 @@ create table &outds (rename=(
out=&outds(rename=(_name_=NAME COL1=MAXLEN));
run;
%mend;
%mend mp_getmaxvarlengths;

View File

@@ -301,4 +301,4 @@
%return;
%end;
%mend;
%mend mp_guesspk;

View File

@@ -72,4 +72,4 @@
if &lastvar then output;
run;
%end;
%mend;
%mend mp_hashdataset;

View File

@@ -75,4 +75,4 @@ select distinct lowcase(memname)
)
%end;
%mend;
%mend mp_lib2cards;

View File

@@ -39,4 +39,4 @@
,dttm=%sysfunc(datetime());
quit;
%mend;
%mend mp_perflog;

View File

@@ -85,4 +85,4 @@
"with record &record and " _n_=;
%end;
%mend;
%mend mp_prevobs;

View File

@@ -87,4 +87,4 @@ insert into &outds select distinct * from &append_ds;
)
%end;
%mend;
%mend mp_recursivejoin;

View File

@@ -30,4 +30,4 @@ data _null_;
end;
run;
%mend;
%mend mp_resetoption;

View File

@@ -46,4 +46,4 @@
%mend;
%mend mp_runddl;

View File

@@ -117,4 +117,4 @@ proc sql
%put process finished at %sysfunc(datetime(),datetime19.);
%mend;
%mend mp_searchdata;

View File

@@ -49,4 +49,4 @@
quit;
%mend;
%mend mp_setkeyvalue;

View File

@@ -71,4 +71,4 @@
proc append base=&libds data=&syslast nowarn;run;
options &etls_syntaxcheck;
%mend;
%mend mp_stprequests;

View File

@@ -134,4 +134,4 @@ run;
%mp_binarycopy(inloc="&inloc",outref=_webout)
%end;
%mend;
%mend mp_streamfile;

View File

@@ -89,4 +89,4 @@ quit;
libname &lib clear;
%mend;
%mend mp_testjob;

View File

@@ -56,4 +56,4 @@ data &outds;
duration_seconds=end_dttm-start_dttm;
run;
%mend;
%mend mp_testwritespeedlibrary;

View File

@@ -68,4 +68,4 @@ data &outds ;
rc=filename('tmp');
run;
%mend;
%mend mp_tree;

View File

@@ -63,4 +63,4 @@ data _null_;
!!'filename &fname2 clear; filename &fname3 clear;');
run;
%mend;
%mend mp_unzip;

View File

@@ -90,4 +90,4 @@ alter table &libds modify &var char(&len);
%mp_createconstraints(inds=&dsconst,outds=&dsconst._addd,execute=YES)
%mend;
%mend mp_updatevarlength;

View File

@@ -76,4 +76,4 @@ ods package publish archive properties
(archive_name="&outname..zip" archive_path="&outpath");
ods package close;
%mend;
%mend mp_zip;

View File

@@ -23,7 +23,7 @@ for file in files:
ml.write(" put '" + line.rstrip().replace("'","''") + " ';\n")
ml.write("run;\n\n")
ml.write("%inc \"%sysfunc(pathname(work))/" + name + ".lua\";\n\n")
ml.write("%mend;\n")
ml.write("%mend " + name + ";\n")
ml.close()

View File

@@ -391,4 +391,4 @@ run;
%inc "%sysfunc(pathname(work))/ml_json.lua";
%mend;
%mend ml_json;

View File

@@ -95,4 +95,4 @@ run;
filename __us2grp clear;
%mend;
%mend mm_adduser2group;

View File

@@ -460,4 +460,4 @@ run;
%return;
%end;
%mend;
%mend mm_assigndirectlib;

View File

@@ -75,4 +75,4 @@
%else %do;
%put NOTE: Library &libref is already assigned;
%end;
%mend;
%mend mm_assignlib;

View File

@@ -152,4 +152,4 @@ run;
%else %put NOTE: Application (&name) successfully created in (&tree)!;
%mend;
%mend mm_createapplication;

View File

@@ -80,4 +80,4 @@ data _null_;
if last then call execute('call missing(of _all_);stop;run;');
run;
%mend;
%mend mm_createdataset;

View File

@@ -122,4 +122,4 @@ run;
run;
%end;
%mend;
%mend mm_createdocument;

View File

@@ -157,4 +157,4 @@ run;
%end;
%put &sysmacroname: execution finished for &path;
%mend;
%mend mm_createfolder;

View File

@@ -318,4 +318,4 @@ filename &frefout temp;
filename &frefout clear;
%end;
%mend;
%mend mm_createlibrary;

View File

@@ -385,4 +385,4 @@ run;
%put %str(WARN)ING: STPTYPE=*&stptype* not recognised!;
%end;
%mend;
%mend mm_createstp;

View File

@@ -269,7 +269,7 @@ data _null_;
put '%local i tempds jsonengine; ';
put ' ';
put '/* see https://github.com/sasjs/core/issues/41 */ ';
put '%if %upcase(&SYSENCODING)=WLATIN1 %then %let jsonengine=PROCJSON; ';
put '%if "%upcase(&SYSENCODING)" ne "UTF-8" %then %let jsonengine=PROCJSON; ';
put '%else %let jsonengine=DATASTEP; ';
put ' ';
put ' ';
@@ -415,7 +415,7 @@ data _null_;
put ' ';
put ' %quote(&user) ';
put ' ';
put '%mend; ';
put '%mend mf_getuser; ';
/* WEBOUT END */
put '%macro webout(action,ds,dslabel=,fmt=);';
put ' %mm_webout(&action,ds=&ds,dslabel=&dslabel,fmt=&fmt)';

View File

@@ -68,4 +68,4 @@ run;
%return;
%end;
%mend;
%mend mm_deletedocument;

View File

@@ -89,4 +89,4 @@ run;
%put &sysmacroname: Library &name (&liburi) was successfully deleted;
%mend;
%mend mm_deletelibrary;

View File

@@ -67,4 +67,4 @@ run;
%return;
%end;
%mend;
%mend mm_deletestp;

View File

@@ -113,4 +113,4 @@ run;
filename &fileref clear;
%mend;
%mend mm_getauthinfo;

View File

@@ -50,4 +50,4 @@ proc sort;
by colname;
run;
%mend;
%mend mm_getcols;

View File

@@ -62,4 +62,4 @@ proc sort;
by type name;
run;
%mend;
%mend mm_getdetails;

View File

@@ -54,4 +54,4 @@ data &outds (keep=directoryuri name directoryname directorydesc );
end;
run;
%mend;
%mend mm_getDirectories;

View File

@@ -143,4 +143,4 @@ run;
filename __getdoc clear;
filename __outdoc clear;
%mend;
%mend mm_getdocument;

View File

@@ -93,4 +93,4 @@
run;
%end;
%mend;
%mend mm_getfoldermembers;

View File

@@ -88,4 +88,4 @@ data _null_;
!!",level=%eval(&level+1),append=YES)");
run;
%mend;
%mend mm_getfoldertree;

View File

@@ -69,4 +69,4 @@
end;
run;
%mend;
%mend mm_getgroupmembers;

View File

@@ -92,4 +92,4 @@
options metarepository=&oldrepo;
%end;
%mend;
%mend mm_getGroups;

View File

@@ -94,4 +94,4 @@ filename sxlemap clear;
filename response clear;
libname _XML_ clear;
%mend;
%mend mm_getlibs;

View File

@@ -67,4 +67,4 @@ filename sxlemap clear;
filename response clear;
libname _XML_ clear;
%mend;
%mend mm_getobjects;

View File

@@ -83,4 +83,4 @@ insert into &outds values ('User');
insert into &outds values ('UserGroup');
quit;
%mend;
%mend mm_getpublictypes;

View File

@@ -129,4 +129,4 @@ filename sxlemap clear;
filename response clear;
libname _XML_ clear;
%mend;
%mend mm_getrepos;

View File

@@ -70,4 +70,4 @@ filename sxlemap clear;
filename response clear;
libname _XML_ clear;
%mend;
%mend mm_getroles;

View File

@@ -81,4 +81,4 @@ options metarepository=&repo;
filename __mc1 clear;
filename __mc2 clear;
%mend;
%mend mm_getservercontexts;

View File

@@ -107,4 +107,4 @@ data &outds ;
keep stpuri stpname treeuri;
run;
%mend;
%mend mm_getstps;

Some files were not shown because too many files have changed in this diff Show More