#!/bin/rc # # command: /bin/boddle /n/juke/plan_9/sys/src/libpanel /sys/src/libpanel # srcdir: /n/juke/plan_9/sys/src/libpanel # version: 836403004 # date: Wed Jul 3 10:10:04 EDT 1996 # myname=$0 doextract=no fn usage{ echo $myname: usage: $myname '[-X] [src-directory]' >[1=2] exit usage } fn sigint{ rm -rf 836403004 exit interrupt } while(~ $1 -*){ switch($1){ case -X doextract=yes case -* usage } shift } switch($#*){ case 0 srcdir=/sys/src/libpanel case 1 srcdir=$1 case * usage } if(! ~ $doextract yes){ echo This shell file contains a bundle of diffs representing changes echo to original source files in the Plan 9 distribution. It will run echo against the files in echo ' ' $srcdir echo '(unless overridden by the optional source directory argument)' echo and create a directory 836403004 containing the updated files. echo It will NOT automatically update the original files. echo echo Invoke with argument -X to perform the actual extraction. exit 0 } rm -rf 836403004 mkdir 836403004 target=836403004/button.c echo -n '836403004/button.c: ' if(! test -f $srcdir/button.c || ! test -r $srcdir/button.c){ echo $srcdir/button.c unreadable exit unreadable } sum=`{sum < $srcdir/button.c} if(! ~ 64e631bb4616 $sum(1)^$sum(2)){ echo $srcdir/button.c is not the original distribution file exit original } cp $srcdir/button.c 836403004/button.c ed 836403004/button.c >/dev/null >[2=1] <<'//GO.SYSIN DD VADIM button.c' 160c void (*hit)(int, int); hit=((Button *)p->data)->menuhit; if(hit) hit(buttons, ((Button *)p->data)->index); . 66c if(sib->hit==pl_hitbutton && ((Button *)sib->data)->btype==RADIO . wq //GO.SYSIN DD VADIM button.c sum=`{sum < 836403004/button.c} if(~ c1eeba074689 $sum(1)^$sum(2)) echo if not{ echo 836403004/button.c checksum error creating updated file exit checksum } target=836403004/edit.c echo -n '836403004/edit.c: ' if(! test -f $srcdir/edit.c || ! test -r $srcdir/edit.c){ echo $srcdir/edit.c unreadable exit unreadable } sum=`{sum < $srcdir/edit.c} if(! ~ 4183b7325445 $sum(1)^$sum(2)){ echo $srcdir/edit.c is not the original distribution file exit original } cp $srcdir/edit.c 836403004/edit.c ed 836403004/edit.c >/dev/null >[2=1] <<'//GO.SYSIN DD VADIM edit.c' 159a v->kind="edit"; . 140a /* * Scroll up until ep->sel0 is above t->bot. */ scrolled=0; do{ bot=t->bot; if(ep->sel0<=bot) break; twscroll(t, twpt2rune(t, Pt(t->r.min.x, t->r.min.y+font->height))); scrolled++; }while(bot!=t->bot); if(scrolled){ sb=p->yscroller; if(sb && sb->setscrollbar) sb->setscrollbar(sb, t->top, t->bot, t->etext-t->text); } . 116a int bot, scrolled; Panel *sb; . wq //GO.SYSIN DD VADIM edit.c sum=`{sum < 836403004/edit.c} if(~ 1fee47265839 $sum(1)^$sum(2)) echo if not{ echo 836403004/edit.c checksum error creating updated file exit checksum } target=836403004/event.c echo -n '836403004/event.c: ' if(! test -f $srcdir/event.c || ! test -r $srcdir/event.c){ echo $srcdir/event.c unreadable exit unreadable } sum=`{sum < $srcdir/event.c} if(! ~ 2c946358839 $sum(1)^$sum(2)){ echo $srcdir/event.c is not the original distribution file exit original } cp $srcdir/event.c 836403004/event.c ed 836403004/event.c >/dev/null >[2=1] <<'//GO.SYSIN DD VADIM event.c' 21c if(v && v->pri(v, p)>=g->pri(g, p)) return v; . 19d 15a /* * Return the most leafward, highest priority panel containing p */ . wq //GO.SYSIN DD VADIM event.c sum=`{sum < 836403004/event.c} if(~ 7ced118c910 $sum(1)^$sum(2)) echo if not{ echo 836403004/event.c checksum error creating updated file exit checksum } target=836403004/idollist.c echo -n '836403004/idollist.c: ' if(! test -f $srcdir/idollist.c || ! test -r $srcdir/idollist.c){ echo $srcdir/idollist.c unreadable exit unreadable } sum=`{sum < $srcdir/idollist.c} if(! ~ 1471a89110526 $sum(1)^$sum(2)){ echo $srcdir/idollist.c is not the original distribution file exit original } cp $srcdir/idollist.c 836403004/idollist.c ed 836403004/idollist.c >/dev/null >[2=1] <<'//GO.SYSIN DD VADIM idollist.c' 350a v->kind="idollist"; . 8a #ifndef nil #define nil ((void *)0) #endif . wq //GO.SYSIN DD VADIM idollist.c sum=`{sum < 836403004/idollist.c} if(~ 225baaa610590 $sum(1)^$sum(2)) echo if not{ echo 836403004/idollist.c checksum error creating updated file exit checksum } target=836403004/list.c echo -n '836403004/list.c: ' if(! test -f $srcdir/list.c || ! test -r $srcdir/list.c){ echo $srcdir/list.c unreadable exit unreadable } sum=`{sum < $srcdir/list.c} if(! ~ e59f108d4629 $sum(1)^$sum(2)){ echo $srcdir/list.c is not the original distribution file exit original } cp $srcdir/list.c 836403004/list.c ed 836403004/list.c >/dev/null >[2=1] <<'//GO.SYSIN DD VADIM list.c' 161c if(flags&(FILLX|EXPAND)){ . wq //GO.SYSIN DD VADIM list.c sum=`{sum < 836403004/list.c} if(~ 6edc00dc4637 $sum(1)^$sum(2)) echo if not{ echo 836403004/list.c checksum error creating updated file exit checksum } target=836403004/mem.c echo -n '836403004/mem.c: ' if(! test -f $srcdir/mem.c || ! test -r $srcdir/mem.c){ echo $srcdir/mem.c unreadable exit unreadable } sum=`{sum < $srcdir/mem.c} if(! ~ b807b3952097 $sum(1)^$sum(2)){ echo $srcdir/mem.c is not the original distribution file exit original } cp $srcdir/mem.c 836403004/mem.c ed 836403004/mem.c >/dev/null >[2=1] <<'//GO.SYSIN DD VADIM mem.c' 64a v->pri=pl_prinormal; . 46a int pl_prinormal(Panel *, Point){ return PRI_NORMAL; } . wq //GO.SYSIN DD VADIM mem.c sum=`{sum < 836403004/mem.c} if(~ b444a8022175 $sum(1)^$sum(2)) echo if not{ echo 836403004/mem.c checksum error creating updated file exit checksum } target=836403004/notes echo -n '836403004/notes: ' if(! test -f $srcdir/notes || ! test -r $srcdir/notes){ echo $srcdir/notes unreadable exit unreadable } sum=`{sum < $srcdir/notes} if(! ~ 3df00187718 $sum(1)^$sum(2)){ echo $srcdir/notes is not the original distribution file exit original } cp $srcdir/notes 836403004/notes ed 836403004/notes >/dev/null >[2=1] <<'//GO.SYSIN DD VADIM notes' 21a Next generation panel library: Use constraints to describe geometry. v==c veqc(Var v, int c) v>=c vgec(Var v, int c) v-w==c deqc(Var v, Var w, int c) v-w>=c dgec(Var v, Var w, int c) v-w==x-y deqd(Var v, Var w, Var x, Var y) v-w>=x-y dged(Var v, Var w, Var x, Var y) val(Var v) Use interlocking finite automata to describe input. primitive events are button transitions rectangle entry/leaving keypresses automata consume events & generate other events, calls to code . wq //GO.SYSIN DD VADIM notes sum=`{sum < 836403004/notes} if(~ 99e367fc1229 $sum(1)^$sum(2)) echo if not{ echo 836403004/notes checksum error creating updated file exit checksum } target=836403004/pldefs.h echo -n '836403004/pldefs.h: ' if(! test -f $srcdir/pldefs.h || ! test -r $srcdir/pldefs.h){ echo $srcdir/pldefs.h unreadable exit unreadable } sum=`{sum < $srcdir/pldefs.h} if(! ~ 8aaf9b122647 $sum(1)^$sum(2)){ echo $srcdir/pldefs.h is not the original distribution file exit original } cp $srcdir/pldefs.h 836403004/pldefs.h ed 836403004/pldefs.h >/dev/null >[2=1] <<'//GO.SYSIN DD VADIM pldefs.h' 49a Panel *pl_ptinpanel(Point, Panel *); /* highest-priority subpanel containing point */ . 10,12c void pl_rtdraw(Bitmap *, Rectangle, Rtext *, int); void pl_rtredraw(Bitmap *, Rectangle, Rtext *, int, int); Rtext *pl_rthit(Rtext *, int, Point, Point); . 1d wq //GO.SYSIN DD VADIM pldefs.h sum=`{sum < 836403004/pldefs.h} if(~ 82676e012723 $sum(1)^$sum(2)) echo if not{ echo 836403004/pldefs.h checksum error creating updated file exit checksum } target=836403004/popup.c echo -n '836403004/popup.c: ' if(! test -f $srcdir/popup.c || ! test -r $srcdir/popup.c){ echo $srcdir/popup.c unreadable exit unreadable } sum=`{sum < $srcdir/popup.c} if(! ~ 45fa7c262607 $sum(1)^$sum(2)){ echo $srcdir/popup.c is not the original distribution file exit original } cp $srcdir/popup.c 836403004/popup.c ed 836403004/popup.c >/dev/null >[2=1] <<'//GO.SYSIN DD VADIM popup.c' 90c v->flags=flags; v->pri=pl_pripopup; . 86a int pl_pripopup(Panel *, Point){ return PRI_POPUP; } . 37c plpack(p, screen.clipr); . wq //GO.SYSIN DD VADIM popup.c sum=`{sum < 836403004/popup.c} if(~ 62c5250d2684 $sum(1)^$sum(2)) echo if not{ echo 836403004/popup.c checksum error creating updated file exit checksum } target=836403004/print.c echo -n '836403004/print.c: ' if(! test -f $srcdir/print.c || ! test -r $srcdir/print.c){ echo $srcdir/print.c unreadable exit unreadable } sum=`{sum < $srcdir/print.c} if(! ~ cb0a12c81594 $sum(1)^$sum(2)){ echo $srcdir/print.c is not the original distribution file exit original } cp $srcdir/print.c 836403004/print.c ed 836403004/print.c >/dev/null >[2=1] <<'//GO.SYSIN DD VADIM print.c' 9c va_start(arg, fmt); write(1, buf, doprint(buf+indent, buf+sizeof(buf), fmt, arg)-buf); va_end(arg); . 7a va_list arg; . wq //GO.SYSIN DD VADIM print.c sum=`{sum < 836403004/print.c} if(~ bbb006a71640 $sum(1)^$sum(2)) echo if not{ echo 836403004/print.c checksum error creating updated file exit checksum } target=836403004/pulldown.c echo -n '836403004/pulldown.c: ' if(! test -f $srcdir/pulldown.c || ! test -r $srcdir/pulldown.c){ echo $srcdir/pulldown.c unreadable exit unreadable } sum=`{sum < $srcdir/pulldown.c} if(! ~ 933fd61d3707 $sum(1)^$sum(2)){ echo $srcdir/pulldown.c is not the original distribution file exit original } cp $srcdir/pulldown.c 836403004/pulldown.c ed 836403004/pulldown.c >/dev/null >[2=1] <<'//GO.SYSIN DD VADIM pulldown.c' 133d wq //GO.SYSIN DD VADIM pulldown.c sum=`{sum < 836403004/pulldown.c} if(~ ad4aaf5c3687 $sum(1)^$sum(2)) echo if not{ echo 836403004/pulldown.c checksum error creating updated file exit checksum } target=836403004/rtext.c echo -n '836403004/rtext.c: ' if(! test -f $srcdir/rtext.c || ! test -r $srcdir/rtext.c){ echo $srcdir/rtext.c unreadable exit unreadable } sum=`{sum < $srcdir/rtext.c} if(! ~ 399cf9864902 $sum(1)^$sum(2)){ echo $srcdir/rtext.c is not the original distribution file exit original } cp $srcdir/rtext.c 836403004/rtext.c ed 836403004/rtext.c >/dev/null >[2=1] <<'//GO.SYSIN DD VADIM rtext.c' 172,211d 165c p.y+=yoffs-ul.y; . 162c /* * Reposition text already drawn in the window. * We just move the pixels and update the positions of any * enclosed panels */ void pl_reposition(Rtext *t, Bitmap *b, Point p, Rectangle r){ Point offs; bitblt(b, p, b, r, S); offs=sub(p, r.min); for(;t;t=t->next) if(!eqrect(t->r, Rect(0,0,0,0)) && !t->b && t->p) plmove(t->p, offs); } /* * Rectangle r of Bitmap b contains an image of Rtext t, offset by oldoffs. * Redraw the text to have offset yoffs. */ void pl_rtredraw(Bitmap *b, Rectangle r, Rtext *t, int yoffs, int oldoffs){ int dy, size; dy=oldoffs-yoffs; size=r.max.y-r.min.y; if(dy>=size || -dy>=size) pl_rtdraw(b, r, t, yoffs); else if(dy<0){ pl_reposition(t, b, r.min, Rect(r.min.x, r.min.y-dy, r.max.x, r.max.y)); pl_rtdraw(b, Rect(r.min.x, r.max.y+dy, r.max.x, r.max.y), t, yoffs+size+dy); } else if(dy>0){ pl_reposition(t, b, Pt(r.min.x, r.min.y+dy), Rect(r.min.x, r.min.y, r.max.x, r.max.y-dy)); pl_rtdraw(b, Rect(r.min.x, r.min.y, r.max.x, r.min.y+dy), t, yoffs); } } Rtext *pl_rthit(Rtext *t, int yoffs, Point p, Point ul){ . 160c clipr(b, cr); . 158d 155c Pt(dr.max.x, dr.max.y-1), ~0, S|D); . 136,142c Rectangle cr; cr=b->clipr; clipr(b, r); bitblt(b, r.min, b, r, Zero); offs=sub(r.min, Pt(0, yoffs)); for(;t;t=t->next) if(!eqrect(t->r, Rect(0,0,0,0))){ dr=raddp(t->r, offs); if(dr.max.y>r.min.y && dr.min.yspace, p.x, indent); . 103c p.x=indent=pl_space(t->indent, 0, 0); . 97,99c if(a>ascent) ascent=a; if(d>descent) descent=d; if(tp==t) eline=tp->next; else eline=tp; . 93c space=pl_space(tp->space, x, indent); . 62c indent=space=pl_space(t->indent, 0, 0); . 55c int ascent, descent, x, space, a, d, w, topy, indent; . 48a int pl_tabmin, pl_tabsize; void pltabsize(int min, int size){ pl_tabmin=min; pl_tabsize=size; } int pl_space(int space, int pos, int indent){ if(space>=0) return space; switch(PL_OP(space)){ default: return 0; case PL_TAB: return ((pos-indent+pl_tabmin)/pl_tabsize+PL_ARG(space))*pl_tabsize+indent-pos; } } . 9a #include "rtext.h" . wq //GO.SYSIN DD VADIM rtext.c sum=`{sum < 836403004/rtext.c} if(~ 604aa1d95366 $sum(1)^$sum(2)) echo if not{ echo 836403004/rtext.c checksum error creating updated file exit checksum } target=836403004/scrltest.c echo -n '836403004/scrltest.c: ' if(! test -f $srcdir/scrltest.c || ! test -r $srcdir/scrltest.c){ echo $srcdir/scrltest.c unreadable exit unreadable } sum=`{sum < $srcdir/scrltest.c} if(! ~ 63617f131468 $sum(1)^$sum(2)){ echo $srcdir/scrltest.c is not the original distribution file exit original } cp $srcdir/scrltest.c 836403004/scrltest.c ed 836403004/scrltest.c >/dev/null >[2=1] <<'//GO.SYSIN DD VADIM scrltest.c' 30c va_list arg; va_start(arg, s); out = doprint(buf, buf+sizeof(buf), s, arg); va_end(arg); . wq //GO.SYSIN DD VADIM scrltest.c sum=`{sum < 836403004/scrltest.c} if(~ aa5ee37a1512 $sum(1)^$sum(2)) echo if not{ echo 836403004/scrltest.c checksum error creating updated file exit checksum } target=836403004/scrollbar.c echo -n '836403004/scrollbar.c: ' if(! test -f $srcdir/scrollbar.c || ! test -r $srcdir/scrollbar.c){ echo $srcdir/scrollbar.c unreadable exit unreadable } sum=`{sum < $srcdir/scrollbar.c} if(! ~ 0eb470dc3385 $sum(1)^$sum(2)){ echo $srcdir/scrollbar.c is not the original distribution file exit original } cp $srcdir/scrollbar.c 836403004/scrollbar.c ed 836403004/scrollbar.c >/dev/null >[2=1] <<'//GO.SYSIN DD VADIM scrollbar.c' 112a v->pri=pl_priscrollbar; . 108a int pl_priscrollbar(Panel *, Point){ return PRI_SCROLLBAR; } . 70c if(!(sp->buttons&2) && g->state==DOWN && g->scrollee && g->scrollee->scroll) . wq //GO.SYSIN DD VADIM scrollbar.c sum=`{sum < 836403004/scrollbar.c} if(~ d2fd95c83492 $sum(1)^$sum(2)) echo if not{ echo 836403004/scrollbar.c checksum error creating updated file exit checksum } target=836403004/textview.c echo -n '836403004/textview.c: ' if(! test -f $srcdir/textview.c || ! test -r $srcdir/textview.c){ echo $srcdir/textview.c unreadable exit unreadable } sum=`{sum < $srcdir/textview.c} if(! ~ 0cc30b184639 $sum(1)^$sum(2)){ echo $srcdir/textview.c is not the original distribution file exit original } cp $srcdir/textview.c 836403004/textview.c ed 836403004/textview.c >/dev/null >[2=1] <<'//GO.SYSIN DD VADIM textview.c' 178,179c void plsetpostextview(Panel *p, int yoffs){ ((Textview *)p->data)->yoffs=yoffs; . 175,176c int plgetpostextview(Panel *p){ return ((Textview *)p->data)->yoffs; . 161,162c tp->yoffs=0; . 157a v->kind="textview"; v->pri=pl_pritextview; . 147a /* * Priority depends on what thing inside the panel we're pointing at. */ int pl_pritextview(Panel *p, Point xy){ Point ul, size; Textview *tp; Rtext *h; tp=p->data; ul=p->r.min; size=sub(p->r.max, p->r.min); pl_interior(p->state, &ul, &size); h=pl_rthit(tp->text, tp->yoffs, xy, ul); if(h && h->b==0 && h->p!=0){ p=pl_ptinpanel(xy, h->p); if(p) return p->pri(p, xy); } return PRI_NORMAL; } . 136a if(yoffs!=tp->yoffs){ pl_hiliteword(p, tp->hitword); r=pl_outline(p->b, p->r, p->state); pl_rtredraw(p->b, r, tp->text, yoffs, tp->yoffs); tp->yoffs=yoffs; pl_fixtextview(p, tp, r); } . 132,135c switch(buttons){ default: SET(yoffs); break; case 1: /* left -- top moves to pointer */ yoffs=tp->yoffs-num*size.y/den; if(yoffs<0) yoffs=0; break; case 2: /* middle -- absolute index of file */ yoffs=tp->thgt*num/den; break; case 4: /* right -- line pointed at moves to top */ yoffs=tp->yoffs+num*size.y/den; if(yoffs>tp->thgt) yoffs=tp->thgt; break; . 126a Rectangle r; . 124c int yoffs; . 116c pl_hiliteword(p, tp->hitword); . 111,112c pl_hiliteword(p, oldhitword); pl_hiliteword(p, tp->hitword); . 100,104c if(oldhitword==0 || oldhitword->b!=0 || oldhitword->p==0 || (oldhitword->p->flags&REMOUSE)==0){ ul=p->r.min; size=sub(p->r.max, p->r.min); pl_interior(p->state, &ul, &size); tp->hitword=pl_rthit(tp->text, tp->yoffs, m->xy, ul); if(tp->hitword!=0 && tp->hitword->hot==0) tp->hitword=0; } . 78c pl_fixtextview(p, tp, r); . 66,76c p->scr.pos.y=tp->yoffs; pl_rtdraw(b, r, tp->text, tp->yoffs); if(b!=p->b){ bitblt(p->b, p->r.min, b, b->r, S); bfree(b); pl_drawnon(tp->text, p->b); . 57,59c b=balloc(p->r, p->b->ldepth); if(b==0) b=p->b; r=pl_outline(b, p->r, p->state); . 55a Bitmap *b; . 53,54d 51c int twid; . 49a /* * Mark the hilite and update the scroll bar */ void pl_fixtextview(Panel *p, Textview *tp, Rectangle r){ Panel *sb; int lo, hi; pl_hiliteword(p, tp->hitword); lo=tp->yoffs; hi=lo+r.max.y-r.min.y; /* wrong? */ sb=p->yscroller; if(sb && sb->setscrollbar) sb->setscrollbar(sb, lo, hi, tp->thgt); } . 45,46c void pl_drawnon(Rtext *rp, Bitmap *b){ for(;rp!=0;rp=rp->next) . 41,43c * If we draw the text in a backup bitmap and copy it onto the screen, * the bitmap pointers in all the subpanels point to the wrong bitmap. * This code fixes them. . 33c if(rectclip(&r, p->r)) bitblt(p->b, r.min, p->b, r, F&~D); . 30,31c ul.y-=tp->yoffs; . 21c void pl_hiliteword(Panel *p, Rtext *w){ . 13,14c int yoffs; /* offset of top of screen */ . 7c #include . 2a * * Should redo this to copy the already-visible parts on scrolling & only * update the newly appearing stuff -- then the offscreen assembly bitmap can go away. . wq //GO.SYSIN DD VADIM textview.c sum=`{sum < 836403004/textview.c} if(~ 3c3d86535747 $sum(1)^$sum(2)) echo if not{ echo 836403004/textview.c checksum error creating updated file exit checksum } target=836403004/textwin.c echo -n '836403004/textwin.c: ' if(! test -f $srcdir/textwin.c || ! test -r $srcdir/textwin.c){ echo $srcdir/textwin.c unreadable exit unreadable } sum=`{sum < $srcdir/textwin.c} if(! ~ 009e68ae12053 $sum(1)^$sum(2)){ echo $srcdir/textwin.c is not the original distribution file exit original } cp $srcdir/textwin.c 836403004/textwin.c ed 836403004/textwin.c >/dev/null >[2=1] <<'//GO.SYSIN DD VADIM textwin.c' 239c Point ul; int y; ul=t->loc[t->bot-t->top]; y=ul.y+t->hgt; if(y>t->r.max.y) y=t->r.max.y; bitblt(t->b, ul, t->b, Rpt(ul, Pt(t->r.max.x, y)), Zero); ul=Pt(t->r.min.x, y); bitblt(t->b, ul, t->b, Rpt(ul, t->r.max), Zero); . 181c y=ur.y+t->hgt; if(y>t->r.max.y) y=t->r.max.y; bitblt(t->b, ul, t->b, Rpt(ul, Pt(ur.x, y)), fc); . 176d 174c bitblt(t->b, ul, t->b, Rpt(ul, Pt(ur.x, y)), fc); . 172a y=ul.y+t->hgt; if(y>t->r.max.y) y=t->r.max.y; . wq //GO.SYSIN DD VADIM textwin.c sum=`{sum < 836403004/textwin.c} if(~ a1ad4a4f12265 $sum(1)^$sum(2)) echo if not{ echo 836403004/textwin.c checksum error creating updated file exit checksum } target=836403004/get echo -n '836403004/get (new): ' cat > 836403004/get >[2]/dev/null <<'//GO.SYSIN DD VADIM /sys/src/libpanel' #!/bin/rc 9fs fornax cp /n/fornax/sys/src/libpanel/mkfile /n/fornax/sys/src/libpanel/*.[hc] . cp /n/fornax/sys/include/panel.h /sys/include //GO.SYSIN DD VADIM /sys/src/libpanel sum=`{sum < 836403004/get} if(~ 6757f493140 $sum(1)^$sum(2)) echo if not{ echo 836403004/get checksum error extracting new file exit checksum } target=836403004/rtext.h echo -n '836403004/rtext.h (new): ' cat > 836403004/rtext.h >[2]/dev/null <<'//GO.SYSIN DD VADIM /sys/src/libpanel' /* * Rtext definitions */ #define PL_NOPBIT 4 #define PL_NARGBIT 12 #define PL_ARGMASK ((1<