anchor.diff:  
       if (req.beforeAll != null) _beforeAlls.add(req.beforeAll);
       if (req.onAddProgramCtx != null) _onAddProgramCtxs.add(req.onAddProgramCtx);
  -    if (req.onRemoveProgramCtx != null) _onAddProgramCtxs.add(req.onRemoveProgramCtx);
  +    if (req.onRemoveProgramCtx != null) _onRemoveProgramCtxs.add(req.onRemoveProgramCtx);
   
       if (req.ctx != null) {
         var isNew = !_ctxs.contains(req.ctx);
  
positive.code: 
    final _attributes = new Map<String, int>();
    final _uniforms = new Map<String, UniformLocation>();
  
    // following field are stored in ProgramContext to avoid usage on an associative array ProgramContext -> RunOnProgramContext
    final _befores = new List<RunOnProgramContext>();
    final _ats = new List<RunOnProgramContext>();
  
    ProgramContext(this.gl, String vertSrc, String fragSrc) {
      var vertShader = _compileShader(gl, vertSrc, VERTEX_SHADER);
      var fragShader = _compileShader(gl, fragSrc, FRAGMENT_SHADER);
      program = _linkProgram(gl, vertShader, fragShader);
    }
  
    int getAttribLocation(String v) {
  
negative.code:   }
    return program;
  }
  
  
  void injectMatrix4(ProgramContext ctx, Matrix4 mat, String sname) {
    var u = ctx.getUniformLocation(sname);
  