From 4892dbe4e3ba2175823b70b9d252afa02378413b Mon Sep 17 00:00:00 2001
From: Alexander Rose <alex.rose@rcsb.org>
Date: Tue, 22 May 2018 16:46:58 -0700
Subject: [PATCH] added gl shim and renderer spec

---
 package-lock.json                 | Bin 561197 -> 555693 bytes
 package.json                      |   1 -
 src/mol-gl/_spec/gl.shim.ts       | 789 ++++++++++++++++++++++++++
 src/mol-gl/_spec/renderer.spec.ts |  72 ++-
 src/mol-gl/gl.d.ts                | 904 ------------------------------
 5 files changed, 843 insertions(+), 923 deletions(-)
 create mode 100644 src/mol-gl/_spec/gl.shim.ts
 delete mode 100644 src/mol-gl/gl.d.ts

diff --git a/package-lock.json b/package-lock.json
index 7d1f40ec71f5c78182c153e2280a99541d480e58..499eb34bb582cfda06c85d631d12ba659167f391 100644
GIT binary patch
delta 1827
zcmYjSdr(wW7@zaH_wKU0ymnay7w#IRONiuy2vclQ(~?BT%1mM%9kVptN+&B#XCiS-
z#_B3xFJ6`kjv%(;H)u>$l;ub|1tS`$O*CZ_Wn&Fk0-bwrQ~h_(obR0T{a)W~s2SVv
zN3iL59{2{i9zB`oih=ug^HB84>{}G*Td5`*h4*-(f%*FcH1`l4woOw~p!aza2gA*5
zl99P+oly{WzV1qcS$8Ud=$DJW^+4&5!amlzd=i5xz0_U}t=y*?zn9sIrnT!BbS|a3
zkr}Cm#cPOe)YL1{i;*A8jTO~nqg}%u#lG1AsWV9yIJVIg%oJn>$6yR87Eq9?gdlt$
zNr13l@nLHmIl_(2g&|l~PkcsNWh~VB$mh_XL_^R$T^WmYNu**te4R^zI6t2p(~R|n
ziEw!f@xVhw^Fq#f;;nd@<zUHNvg|hSMwpK0o+EX{K2rVy*`z`LTo%H#Qt}apKB4F^
zaXV2V@QdQWq3xuKnLvVAzmwdOV4v!(A{h>Fd({vI>c~U_;X-m7ly`6qOX^8qG89y?
z5EL$CKHS_+CTm7(ZwSWS%tpb*(<B*NI>-!*Gsyl<_9?nZgHc+e!>SGui(ht;XE@St
z$Xy9AU6O3`^!|S8GYUK&+}%%l9Y$kP2&Of#B&-}D<pG?UME#nL?cr4FblK`ef^Ljt
zP(QO3H<!C7(7m_9`Vtz%Sr5~!6q77NZb0W(+-n?S9+;_WF34^r<DqLkU2Y7Og>e1`
z+NHvt>C7s{tj%=bAxo0flWGtm>1qOOy+&N{Xbnk$R}B&iIZaZ!mM;1UflV1K14iok
z7(9HA-uQ>9;%!PUgcFzoBN5Gk9c9X1id%c=I2DF9VKWDkIUoM;9nE#%U_VVD@aa|B
zXClWBf1|$!%+_F9g?#sHEc+hv{VWsX+~jQvO|Q@xb0-EzlG$Q{JG^XBqUB1wGLC`M
z#IHm7B=(7EMYxPI0PC10aP4H4ZtD`xW${>>$J(40)ly^)x6EemQTVit=$Jj1IUObi
zC^f#8WVg~F*-M$HIH9|lj)DdAm<M4sd!1Mb!<;ABvD;0R@p>)WLM@lJg=NjQ_t-`P
zrDbd^y7#jPx13Ok%z?&1Hesc-j%9&Z$Tp~eq6>1P*TXyA@cVJ0!`0DT7)$0P7-iSJ
z5Vw_Z=pVyt%<JqutPb$si0x`w%ds|%$H^iyKC*WmF0`v&{OcxOywQp)?5g4lKKTy!
zGvmb<GT`lM-fheZ>$tUs&$E1tm+JTdVe?=#^3@I;-@<b#Y<@#z;Ik+AWD0#Q5`?CO
zQob)*`QQZ5mMCu6^)r9dveS%yUaP{RCwT@WN9j#)=p3B@gO4bqvG@<(O03sH1M<s8
z7|VnT{mYbi7+K6+aCNVmg9X=lXQE}n^Uc(6bG^(hMq;faxH=$$)QSUCq=_rgc#wp^
zd5pTD18F=ww_N77M;HBmD;N;Tl(Fm173OG^>BpFS5m$_V){4h8`@WKcBH3Y-I6_zz
z6(0p~$Jb(cjAe|rBB@F7XqE!5LY9j8m&D;z3mS@H(djpa$AsYQ9^%0vpHfq5%&yY$
z;9JVC0usBFAReeu9*ei|79CZpe0HDz%sCHEIi;+RGb)dVDkcgJ>7P+AywR=(ao~b7
zXR7^rkCF*n;?!o#+)$FFD)7z%nZKgPnG5porXGyMtMLjh9i@I816fZKr*Za_4ogqd
zG}v&0r<&m%k3UURH|3e|AiP#}!5wELQ742*H<vNsJgO!e#VcHJrbS{6Q!)-3n}rwd
zZReYC*BbSbZlx%4MyBZS7c#t!JJl9&d&K{2YYaWE;Y;OeS=N7}$p3+w&ESDHIYQ3m
zX$i37s=TzRhvwjs57n>uzavz(J6g`{^X+Q)Yc@kCAJlHZjwRZFMQ`B^qE<X5r-;6S
kEaVt1(zxT_S76^%Z46#srM)XByZPHQhv2Jgw953q0dc{l4FCWD

delta 4322
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
D(9yxI

diff --git a/package.json b/package.json
index 23c931617..af8549625 100644
--- a/package.json
+++ b/package.json
@@ -91,7 +91,6 @@
   "dependencies": {
     "argparse": "^1.0.10",
     "express": "^4.16.3",
-    "gl": "^4.0.4",
     "immutable": "^4.0.0-rc.9",
     "node-fetch": "^2.1.2",
     "react": "^16.3.2",
diff --git a/src/mol-gl/_spec/gl.shim.ts b/src/mol-gl/_spec/gl.shim.ts
new file mode 100644
index 000000000..d4242f5a1
--- /dev/null
+++ b/src/mol-gl/_spec/gl.shim.ts
@@ -0,0 +1,789 @@
+
+
+/**
+ * Copyright (c) 2018 mol* contributors, licensed under MIT, See LICENSE file for more info.
+ *
+ * @author Alexander Rose <alexander.rose@weirdbyte.de>
+ */
+
+import { idFactory } from 'mol-util/id-factory'
+
+const c = {
+    ACTIVE_ATTRIBUTE_MAX_LENGTH: 35722,
+    ACTIVE_UNIFORM_MAX_LENGTH: 35719,
+    INFO_LOG_LENGTH: 35716,
+    NUM_COMPRESSED_TEXTURE_FORMATS: 34466,
+    SHADER_COMPILER: 36346,
+    SHADER_SOURCE_LENGTH: 35720,
+
+    MAX_TEXTURE_MAX_ANISOTROPY_EXT: 0x84FF,
+    MAX_TEXTURE_IMAGE_UNITS_NV: 0x8872
+}
+
+const gl = {
+    ACTIVE_ATTRIBUTES: 35721,
+    ACTIVE_TEXTURE: 34016,
+    ACTIVE_UNIFORMS: 35718,
+    ALIASED_LINE_WIDTH_RANGE: 33902,
+    ALIASED_POINT_SIZE_RANGE: 33901,
+    ALPHA: 6406,
+    ALPHA_BITS: 3413,
+    ALWAYS: 519,
+    ARRAY_BUFFER: 34962,
+    ARRAY_BUFFER_BINDING: 34964,
+    ATTACHED_SHADERS: 35717,
+    BACK: 1029,
+    BLEND: 3042,
+    BLEND_COLOR: 32773,
+    BLEND_DST_ALPHA: 32970,
+    BLEND_DST_RGB: 32968,
+    BLEND_EQUATION: 32777,
+    BLEND_EQUATION_ALPHA: 34877,
+    BLEND_EQUATION_RGB: 32777,
+    BLEND_SRC_ALPHA: 32971,
+    BLEND_SRC_RGB: 32969,
+    BLUE_BITS: 3412,
+    BOOL: 35670,
+    BOOL_VEC2: 35671,
+    BOOL_VEC3: 35672,
+    BOOL_VEC4: 35673,
+    BROWSER_DEFAULT_WEBGL: 37444,
+    BUFFER_SIZE: 34660,
+    BUFFER_USAGE: 34661,
+    BYTE: 5120,
+    CCW: 2305,
+    CLAMP_TO_EDGE: 33071,
+    COLOR_ATTACHMENT0: 36064,
+    COLOR_BUFFER_BIT: 16384,
+    COLOR_CLEAR_VALUE: 3106,
+    COLOR_WRITEMASK: 3107,
+    COMPILE_STATUS: 35713,
+    COMPRESSED_TEXTURE_FORMATS: 34467,
+    CONSTANT_ALPHA: 32771,
+    CONSTANT_COLOR: 32769,
+    CONTEXT_LOST_WEBGL: 37442,
+    CULL_FACE: 2884,
+    CULL_FACE_MODE: 2885,
+    CURRENT_PROGRAM: 35725,
+    CURRENT_VERTEX_ATTRIB: 34342,
+    CW: 2304,
+    DECR: 7683,
+    DECR_WRAP: 34056,
+    DELETE_STATUS: 35712,
+    DEPTH_ATTACHMENT: 36096,
+    DEPTH_BITS: 3414,
+    DEPTH_BUFFER_BIT: 256,
+    DEPTH_CLEAR_VALUE: 2931,
+    DEPTH_COMPONENT: 6402,
+    DEPTH_COMPONENT16: 33189,
+    DEPTH_FUNC: 2932,
+    DEPTH_RANGE: 2928,
+    DEPTH_STENCIL: 34041,
+    DEPTH_STENCIL_ATTACHMENT: 33306,
+    DEPTH_TEST: 2929,
+    DEPTH_WRITEMASK: 2930,
+    DITHER: 3024,
+    DONT_CARE: 4352,
+    DST_ALPHA: 772,
+    DST_COLOR: 774,
+    DYNAMIC_DRAW: 35048,
+    ELEMENT_ARRAY_BUFFER: 34963,
+    ELEMENT_ARRAY_BUFFER_BINDING: 34965,
+    EQUAL: 514,
+    FASTEST: 4353,
+    FLOAT: 5126,
+    FLOAT_MAT2: 35674,
+    FLOAT_MAT3: 35675,
+    FLOAT_MAT4: 35676,
+    FLOAT_VEC2: 35664,
+    FLOAT_VEC3: 35665,
+    FLOAT_VEC4: 35666,
+    FRAGMENT_SHADER: 35632,
+    FRAMEBUFFER: 36160,
+    FRAMEBUFFER_ATTACHMENT_OBJECT_NAME: 36049,
+    FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE: 36048,
+    FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE: 36051,
+    FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL: 36050,
+    FRAMEBUFFER_BINDING: 36006,
+    FRAMEBUFFER_COMPLETE: 36053,
+    FRAMEBUFFER_INCOMPLETE_ATTACHMENT: 36054,
+    FRAMEBUFFER_INCOMPLETE_DIMENSIONS: 36057,
+    FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: 36055,
+    FRAMEBUFFER_UNSUPPORTED: 36061,
+    FRONT: 1028,
+    FRONT_AND_BACK: 1032,
+    FRONT_FACE: 2886,
+    FUNC_ADD: 32774,
+    FUNC_REVERSE_SUBTRACT: 32779,
+    FUNC_SUBTRACT: 32778,
+    GENERATE_MIPMAP_HINT: 33170,
+    GEQUAL: 518,
+    GREATER: 516,
+    GREEN_BITS: 3411,
+    HIGH_FLOAT: 36338,
+    HIGH_INT: 36341,
+    IMPLEMENTATION_COLOR_READ_FORMAT: 0x8B9B,
+    IMPLEMENTATION_COLOR_READ_TYPE: 0x8B9A,
+    INCR: 7682,
+    INCR_WRAP: 34055,
+    INT: 5124,
+    INT_VEC2: 35667,
+    INT_VEC3: 35668,
+    INT_VEC4: 35669,
+    INVALID_ENUM: 1280,
+    INVALID_FRAMEBUFFER_OPERATION: 1286,
+    INVALID_OPERATION: 1282,
+    INVALID_VALUE: 1281,
+    INVERT: 5386,
+    KEEP: 7680,
+    LEQUAL: 515,
+    LESS: 513,
+    LINEAR: 9729,
+    LINEAR_MIPMAP_LINEAR: 9987,
+    LINEAR_MIPMAP_NEAREST: 9985,
+    LINES: 1,
+    LINE_LOOP: 2,
+    LINE_STRIP: 3,
+    LINE_WIDTH: 2849,
+    LINK_STATUS: 35714,
+    LOW_FLOAT: 36336,
+    LOW_INT: 36339,
+    LUMINANCE: 6409,
+    LUMINANCE_ALPHA: 6410,
+    MAX_COMBINED_TEXTURE_IMAGE_UNITS: 35661,
+    MAX_CUBE_MAP_TEXTURE_SIZE: 34076,
+    MAX_FRAGMENT_UNIFORM_VECTORS: 36349,
+    MAX_RENDERBUFFER_SIZE: 34024,
+    MAX_TEXTURE_IMAGE_UNITS: 34930,
+    MAX_TEXTURE_SIZE: 3379,
+    MAX_VARYING_VECTORS: 36348,
+    MAX_VERTEX_ATTRIBS: 34921,
+    MAX_VERTEX_TEXTURE_IMAGE_UNITS: 35660,
+    MAX_VERTEX_UNIFORM_VECTORS: 36347,
+    MAX_VIEWPORT_DIMS: 3386,
+    MEDIUM_FLOAT: 36337,
+    MEDIUM_INT: 36340,
+    MIRRORED_REPEAT: 33648,
+    NEAREST: 9728,
+    NEAREST_MIPMAP_LINEAR: 9986,
+    NEAREST_MIPMAP_NEAREST: 9984,
+    NEVER: 512,
+    NICEST: 4354,
+    NONE: 0,
+    NOTEQUAL: 517,
+    NO_ERROR: 0,
+    ONE: 1,
+    ONE_MINUS_CONSTANT_ALPHA: 32772,
+    ONE_MINUS_CONSTANT_COLOR: 32770,
+    ONE_MINUS_DST_ALPHA: 773,
+    ONE_MINUS_DST_COLOR: 775,
+    ONE_MINUS_SRC_ALPHA: 771,
+    ONE_MINUS_SRC_COLOR: 769,
+    OUT_OF_MEMORY: 1285,
+    PACK_ALIGNMENT: 3333,
+    POINTS: 0,
+    POLYGON_OFFSET_FACTOR: 32824,
+    POLYGON_OFFSET_FILL: 32823,
+    POLYGON_OFFSET_UNITS: 10752,
+    RED_BITS: 3410,
+    RENDERBUFFER: 36161,
+    RENDERBUFFER_ALPHA_SIZE: 36179,
+    RENDERBUFFER_BINDING: 36007,
+    RENDERBUFFER_BLUE_SIZE: 36178,
+    RENDERBUFFER_DEPTH_SIZE: 36180,
+    RENDERBUFFER_GREEN_SIZE: 36177,
+    RENDERBUFFER_HEIGHT: 36163,
+    RENDERBUFFER_INTERNAL_FORMAT: 36164,
+    RENDERBUFFER_RED_SIZE: 36176,
+    RENDERBUFFER_STENCIL_SIZE: 36181,
+    RENDERBUFFER_WIDTH: 36162,
+    RENDERER: 7937,
+    REPEAT: 10497,
+    REPLACE: 7681,
+    RGB: 6407,
+    RGB5_A1: 32855,
+    RGB565: 36194,
+    RGBA: 6408,
+    RGBA4: 32854,
+    SAMPLER_2D: 35678,
+    SAMPLER_CUBE: 35680,
+    SAMPLES: 32937,
+    SAMPLE_ALPHA_TO_COVERAGE: 32926,
+    SAMPLE_BUFFERS: 32936,
+    SAMPLE_COVERAGE: 32928,
+    SAMPLE_COVERAGE_INVERT: 32939,
+    SAMPLE_COVERAGE_VALUE: 32938,
+    SCISSOR_BOX: 3088,
+    SCISSOR_TEST: 3089,
+    SHADER_TYPE: 35663,
+    SHADING_LANGUAGE_VERSION: 35724,
+    SHORT: 5122,
+    SRC_ALPHA: 770,
+    SRC_ALPHA_SATURATE: 776,
+    SRC_COLOR: 768,
+    STATIC_DRAW: 35044,
+    STENCIL_ATTACHMENT: 36128,
+    STENCIL_BACK_FAIL: 34817,
+    STENCIL_BACK_FUNC: 34816,
+    STENCIL_BACK_PASS_DEPTH_FAIL: 34818,
+    STENCIL_BACK_PASS_DEPTH_PASS: 34819,
+    STENCIL_BACK_REF: 36003,
+    STENCIL_BACK_VALUE_MASK: 36004,
+    STENCIL_BACK_WRITEMASK: 36005,
+    STENCIL_BITS: 3415,
+    STENCIL_BUFFER_BIT: 1024,
+    STENCIL_CLEAR_VALUE: 2961,
+    STENCIL_FAIL: 2964,
+    STENCIL_FUNC: 2962,
+    STENCIL_INDEX: 6401,
+    STENCIL_INDEX8: 36168,
+    STENCIL_PASS_DEPTH_FAIL: 2965,
+    STENCIL_PASS_DEPTH_PASS: 2966,
+    STENCIL_REF: 2967,
+    STENCIL_TEST: 2960,
+    STENCIL_VALUE_MASK: 2963,
+    STENCIL_WRITEMASK: 2968,
+    STREAM_DRAW: 35040,
+    SUBPIXEL_BITS: 3408,
+    TEXTURE: 5890,
+    TEXTURE0: 33984,
+    TEXTURE1: 33985,
+    TEXTURE2: 33986,
+    TEXTURE3: 33987,
+    TEXTURE4: 33988,
+    TEXTURE5: 33989,
+    TEXTURE6: 33990,
+    TEXTURE7: 33991,
+    TEXTURE8: 33992,
+    TEXTURE9: 33993,
+    TEXTURE10: 33994,
+    TEXTURE11: 33995,
+    TEXTURE12: 33996,
+    TEXTURE13: 33997,
+    TEXTURE14: 33998,
+    TEXTURE15: 33999,
+    TEXTURE16: 34000,
+    TEXTURE17: 34001,
+    TEXTURE18: 34002,
+    TEXTURE19: 34003,
+    TEXTURE20: 34004,
+    TEXTURE21: 34005,
+    TEXTURE22: 34006,
+    TEXTURE23: 34007,
+    TEXTURE24: 34008,
+    TEXTURE25: 34009,
+    TEXTURE26: 34010,
+    TEXTURE27: 34011,
+    TEXTURE28: 34012,
+    TEXTURE29: 34013,
+    TEXTURE30: 34014,
+    TEXTURE31: 34015,
+    TEXTURE_2D: 3553,
+    TEXTURE_BINDING_2D: 32873,
+    TEXTURE_BINDING_CUBE_MAP: 34068,
+    TEXTURE_CUBE_MAP: 34067,
+    TEXTURE_CUBE_MAP_NEGATIVE_X: 34070,
+    TEXTURE_CUBE_MAP_NEGATIVE_Y: 34072,
+    TEXTURE_CUBE_MAP_NEGATIVE_Z: 34074,
+    TEXTURE_CUBE_MAP_POSITIVE_X: 34069,
+    TEXTURE_CUBE_MAP_POSITIVE_Y: 34071,
+    TEXTURE_CUBE_MAP_POSITIVE_Z: 34073,
+    TEXTURE_MAG_FILTER: 10240,
+    TEXTURE_MIN_FILTER: 10241,
+    TEXTURE_WRAP_S: 10242,
+    TEXTURE_WRAP_T: 10243,
+    TRIANGLES: 4,
+    TRIANGLE_FAN: 6,
+    TRIANGLE_STRIP: 5,
+    UNPACK_ALIGNMENT: 3317,
+    UNPACK_COLORSPACE_CONVERSION_WEBGL: 37443,
+    UNPACK_FLIP_Y_WEBGL: 37440,
+    UNPACK_PREMULTIPLY_ALPHA_WEBGL: 37441,
+    UNSIGNED_BYTE: 5121,
+    UNSIGNED_INT: 5125,
+    UNSIGNED_SHORT: 5123,
+    UNSIGNED_SHORT_4_4_4_4: 32819,
+    UNSIGNED_SHORT_5_5_5_1: 32820,
+    UNSIGNED_SHORT_5_6_5: 33635,
+    VALIDATE_STATUS: 35715,
+    VENDOR: 7936,
+    VERSION: 7938,
+    VERTEX_ATTRIB_ARRAY_BUFFER_BINDING: 34975,
+    VERTEX_ATTRIB_ARRAY_ENABLED: 34338,
+    VERTEX_ATTRIB_ARRAY_NORMALIZED: 34922,
+    VERTEX_ATTRIB_ARRAY_POINTER: 34373,
+    VERTEX_ATTRIB_ARRAY_SIZE: 34339,
+    VERTEX_ATTRIB_ARRAY_STRIDE: 34340,
+    VERTEX_ATTRIB_ARRAY_TYPE: 34341,
+    VERTEX_SHADER: 35633,
+    VIEWPORT: 2978,
+    ZERO: 0
+}
+type gl = typeof gl
+
+export function createGl(width: number, height: number, contextAttributes: WebGLContextAttributes): WebGLRenderingContext {
+    const getNextId = idFactory()
+    const items: { [k: number]: any } = {}
+    const boundTextures: { [k: number]: any } = {}
+    const viewport = { x: 0, y: 0, width, height }
+    const depthRange = { zNear: 0, zFar: 1 }
+    const colorClearValue = { r: 0, g: 0, b: 0, a: 0 }
+
+    // let _activeFramebuffer: number
+    // let _activeRenderbuffer: number
+
+    return {
+        ...gl,
+        canvas: {
+            width, height
+        } as HTMLCanvasElement,
+        getAttachedShaders: function(program: WebGLProgram) {
+            return [] as WebGLShader[]
+        },
+        getBufferParameter: function(target: number, pname: number) {
+            return 0
+        },
+        getContextAttributes: function() { return contextAttributes },
+        getFramebufferAttachmentParameter: function() {},
+        getProgramInfoLog: function() { return ''; },
+        getShaderInfoLog: function() { return ''; },
+        getRenderbufferParameter: function() {},
+        getShaderPrecisionFormat: function(shadertype: number, precisiontype: number) {
+            return {
+                precision: 0,
+                rangeMax: 0,
+                rangeMin: 0
+            }
+        },
+        getShaderSource: function(shader: WebGLShader | null) { return ''; },
+        getTexParameter: function() {},
+        getUniform: function() {},
+        getVertexAttrib: function() {},
+        getVertexAttribOffset: function(index: number, pname: number) { return 0; },
+        hint: function(target: number, mode: number) {},
+        isBuffer: function(buffer: WebGLBuffer | null) { return true; },
+        isEnabled: function(cap: number) { return true; },
+        isFramebuffer: function(framebuffer: WebGLFramebuffer | null) { return true; },
+        isProgram: function(program: WebGLProgram | null) { return true; },
+        isRenderbuffer: function(renderbuffer: WebGLRenderbuffer | null) { return true; },
+        isShader: function(shader: WebGLShader | null) { return true; },
+        isTexture: function(texture: WebGLTexture | null) { return true; },
+        getExtension: function (extensionName: string): any {
+            switch (extensionName) {
+                case 'EXT_blend_minmax': return {
+                    MAX_EXT: 0,
+                    MIN_EXT: 0
+                } as EXT_blend_minmax
+                case 'EXT_texture_filter_anisotropic': return {
+                    MAX_TEXTURE_MAX_ANISOTROPY_EXT: 0,
+                    TEXTURE_MAX_ANISOTROPY_EXT: 0
+                } as EXT_texture_filter_anisotropic
+                case 'EXT_frag_depth': return {} as EXT_frag_depth
+                case 'EXT_shader_texture_lod': return {} as EXT_shader_texture_lod
+                case 'EXT_sRGB': return {
+                    FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT: 0,
+                    SRGB8_ALPHA8_EXT: 0,
+                    SRGB_ALPHA_EXT: 0,
+                    SRGB_EXT: 0
+                } as EXT_sRGB
+                case 'OES_vertex_array_object': return {
+                    VERTEX_ARRAY_BINDING_OES: 0,
+                    bindVertexArrayOES: function(arrayObject: WebGLVertexArrayObjectOES) { },
+                    createVertexArrayOES: function(): WebGLVertexArrayObjectOES { return {} },
+                    deleteVertexArrayOES: function(arrayObject: WebGLVertexArrayObjectOES) { },
+                    isVertexArrayOES: function(value: any) { return true; }
+                } as OES_vertex_array_object
+                case 'WEBGL_color_buffer_float': return {
+                    FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE_EXT: 0,
+                    RGB32F_EXT: 0,
+                    RGBA32F_EXT: 0,
+                    UNSIGNED_NORMALIZED_EXT: 0
+                } as WEBGL_color_buffer_float
+                case 'WEBGL_compressed_texture_astc': return null
+                case 'WEBGL_compressed_texture_s3tc_srgb': return null
+                case 'WEBGL_debug_shaders': return {
+                    getTranslatedShaderSource(shader: WebGLShader) { return ''; }
+                } as WEBGL_debug_shaders
+                case 'WEBGL_draw_buffers': return null
+                case 'WEBGL_lose_context': return {
+                    loseContext: function() { },
+                    restoreContext: function() { },
+                } as WEBGL_lose_context
+                case 'WEBGL_depth_texture': return {
+                    UNSIGNED_INT_24_8_WEBGL: 0
+                } as WEBGL_depth_texture
+                case 'WEBGL_debug_renderer_info': return {
+                    UNMASKED_RENDERER_WEBGL: 0,
+                    UNMASKED_VENDOR_WEBGL: 0
+                } as WEBGL_debug_renderer_info
+                case 'WEBGL_compressed_texture_s3tc': return null
+                case 'OES_texture_half_float_linear': return {} as OES_texture_half_float_linear
+                case 'OES_texture_half_float': return {
+                    HALF_FLOAT_OES: 0
+                } as OES_texture_half_float
+                case 'OES_texture_float_linear': return {} as OES_texture_float_linear
+                case 'OES_texture_float': return {} as OES_texture_float
+                case 'OES_standard_derivatives': return {
+                    FRAGMENT_SHADER_DERIVATIVE_HINT_OES: 0
+                } as OES_standard_derivatives
+                case 'OES_element_index_uint': return {} as OES_element_index_uint
+                case 'ANGLE_instanced_arrays': return {
+                    drawArraysInstancedANGLE: function(mode: number, first: number, count: number, primcount: number) {},
+                    drawElementsInstancedANGLE: function(mode: number, count: number, type: number, offset: number, primcount: number) {},
+                    vertexAttribDivisorANGLE: function(index: number, divisor: number) {},
+                    VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE: 0
+                } as ANGLE_instanced_arrays
+            }
+            return null
+        },
+        createBuffer: function () {
+            const id = getNextId()
+            items[id] = {
+                which: 'buffer',
+            };
+            return id;
+        },
+        deleteBuffer: function () { },
+        bindBuffer: function () { },
+        bufferData: function () { },
+        getParameter: function (pname: number) {
+            switch (pname) {
+                case c.MAX_TEXTURE_MAX_ANISOTROPY_EXT: return 16;
+                case c.MAX_TEXTURE_IMAGE_UNITS_NV: return 16;
+
+                case gl.ELEMENT_ARRAY_BUFFER_BINDING:
+                case gl.ARRAY_BUFFER_BINDING:
+                case gl.FRAMEBUFFER_BINDING:
+                case gl.CURRENT_PROGRAM:
+                case gl.RENDERBUFFER_BINDING:
+                    return 0;
+                    // return _activeFramebuffer
+                    // return _activeRenderbuffer
+                case gl.TEXTURE_BINDING_2D:
+                case gl.TEXTURE_BINDING_CUBE_MAP:
+                    return null
+
+                case gl.VERSION:
+                    return '1.0.0'
+                case gl.VENDOR:
+                    return 'shim'
+                case gl.RENDERER:
+                    return 'shim-renderer'
+                case gl.SHADING_LANGUAGE_VERSION:
+                    return 'WebGL GLSL ES 1.0 shim'
+
+                case gl.COMPRESSED_TEXTURE_FORMATS:
+                    return new Uint32Array(0)
+
+                // Int arrays
+                case gl.MAX_VIEWPORT_DIMS:
+                case gl.SCISSOR_BOX:
+                    return new Int32Array([ 0, 0, 4096, 4096 ])
+                case gl.VIEWPORT:
+                    const { x, y, width, height } = viewport
+                    return new Int32Array([ x, y, width, height ])
+
+                // Float arrays
+                case gl.ALIASED_LINE_WIDTH_RANGE:
+                    return new Float32Array([0, 1])
+                case gl.ALIASED_POINT_SIZE_RANGE:
+                    return new Float32Array([0, 255])
+                case gl.DEPTH_RANGE:
+                    return new Float32Array([ depthRange.zNear, depthRange.zFar ])
+                case gl.BLEND_COLOR:
+                    return new Float32Array([0, 0, 0, 0])
+                case gl.COLOR_CLEAR_VALUE:
+                    const { r, g, b, a } = colorClearValue
+                    return new Float32Array([ r, g, b, a ])
+
+                case gl.COLOR_WRITEMASK:
+                    return 0
+
+                case gl.DEPTH_CLEAR_VALUE:
+                case gl.LINE_WIDTH:
+                case gl.POLYGON_OFFSET_FACTOR:
+                case gl.POLYGON_OFFSET_UNITS:
+                case gl.SAMPLE_COVERAGE_VALUE:
+                    return 1
+
+                case gl.BLEND:
+                case gl.CULL_FACE:
+                case gl.DEPTH_TEST:
+                case gl.DEPTH_WRITEMASK:
+                case gl.DITHER:
+                case gl.POLYGON_OFFSET_FILL:
+                case gl.SAMPLE_COVERAGE_INVERT:
+                case gl.SCISSOR_TEST:
+                case gl.STENCIL_TEST:
+                case gl.UNPACK_FLIP_Y_WEBGL:
+                case gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL:
+                    return false;
+
+                case gl.MAX_TEXTURE_SIZE:
+                case gl.MAX_CUBE_MAP_TEXTURE_SIZE:
+                    return 16384;
+
+                case gl.MAX_VERTEX_UNIFORM_VECTORS:
+                case gl.MAX_FRAGMENT_UNIFORM_VECTORS:
+                    return 4096;
+
+                case gl.MAX_VARYING_VECTORS:
+                case gl.MAX_TEXTURE_IMAGE_UNITS:
+                case gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS:
+                case gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS:
+                    return 32;
+
+                case gl.MAX_RENDERBUFFER_SIZE:
+                    return 2048;
+
+                case gl.ACTIVE_TEXTURE:
+                case gl.ALPHA_BITS:
+                case gl.BLEND_DST_ALPHA:
+                case gl.BLEND_DST_RGB:
+                case gl.BLEND_EQUATION_ALPHA:
+                case gl.BLEND_EQUATION_RGB:
+                case gl.BLEND_SRC_ALPHA:
+                case gl.BLEND_SRC_RGB:
+                case gl.BLUE_BITS:
+                case gl.CULL_FACE_MODE:
+                case gl.DEPTH_BITS:
+                case gl.DEPTH_FUNC:
+                case gl.FRONT_FACE:
+                case gl.GENERATE_MIPMAP_HINT:
+                case gl.GREEN_BITS:
+                case gl.MAX_VERTEX_ATTRIBS:
+                case gl.PACK_ALIGNMENT:
+                case gl.RED_BITS:
+                case gl.SAMPLE_BUFFERS:
+                case gl.SAMPLES:
+                case gl.STENCIL_BACK_FAIL:
+                case gl.STENCIL_BACK_FUNC:
+                case gl.STENCIL_BACK_PASS_DEPTH_FAIL:
+                case gl.STENCIL_BACK_PASS_DEPTH_PASS:
+                case gl.STENCIL_BACK_REF:
+                case gl.STENCIL_BACK_VALUE_MASK:
+                case gl.STENCIL_BACK_WRITEMASK:
+                case gl.STENCIL_BITS:
+                case gl.STENCIL_CLEAR_VALUE:
+                case gl.STENCIL_FAIL:
+                case gl.STENCIL_FUNC:
+                case gl.STENCIL_PASS_DEPTH_FAIL:
+                case gl.STENCIL_PASS_DEPTH_PASS:
+                case gl.STENCIL_REF:
+                case gl.STENCIL_VALUE_MASK:
+                case gl.STENCIL_WRITEMASK:
+                case gl.SUBPIXEL_BITS:
+                case gl.UNPACK_ALIGNMENT:
+                case gl.UNPACK_COLORSPACE_CONVERSION_WEBGL:
+                    return 0;
+
+                default:
+                    return 0;
+            }
+        },
+        getSupportedExtensions: function () {
+            return [
+                'EXT_blend_minmax', 'EXT_texture_filter_anisotropic', 'EXT_frag_depth',
+                'EXT_shader_texture_lod', 'EXT_sRGB', 'OES_vertex_array_object',
+                'WEBGL_color_buffer_float', 'WEBGL_debug_shaders', 'WEBGL_lose_context',
+                'WEBGL_depth_texture', 'WEBGL_debug_renderer_info', 'OES_texture_half_float_linear',
+                'OES_texture_half_float', 'OES_texture_float_linear', 'OES_texture_float',
+                'OES_standard_derivatives', 'OES_element_index_uint', 'ANGLE_instanced_arrays'
+            ];
+        },
+        createShader: function (type: number) {
+            const id = getNextId()
+            items[id] = {
+                which: 'shader',
+                type: type,
+            };
+            return id as WebGLShader;
+        },
+        getShaderParameter: function (shader: WebGLShader, pname: number) {
+            switch (pname) {
+                case gl.SHADER_TYPE: return items[shader as number].type;
+                case gl.COMPILE_STATUS: return true;
+                default: throw `getShaderParameter ${pname}`;
+            }
+        },
+        shaderSource: function () { },
+        compileShader: function () { },
+        createProgram: function () {
+            const id = getNextId()
+            items[id] = {
+                which: 'program',
+                shaders: [],
+            };
+            return id;
+        },
+        attachShader: function (program: WebGLProgram, shader: WebGLShader) {
+            items[program as number].shaders.push(shader as number);
+        },
+        bindAttribLocation: function () { },
+        linkProgram: function () { },
+        getProgramParameter: function (program: number, pname: number) {
+            switch (pname) {
+                case gl.LINK_STATUS: return true;
+                case gl.ACTIVE_UNIFORMS: return 4;
+                case gl.ACTIVE_ATTRIBUTES: return 0;
+                case gl.ACTIVE_UNIFORMS: return 0;
+                case gl.DELETE_STATUS: return false;
+                case gl.VALIDATE_STATUS: return true;
+                case gl.ATTACHED_SHADERS: return 2;
+                default: throw `getProgramParameter ${pname}`;
+            }
+        },
+        deleteShader: function () { },
+        deleteProgram: function () { },
+        viewport: function (x: number, y: number, width: number, height: number) {
+            viewport.x = x
+            viewport.y = y
+            viewport.width = width
+            viewport.height = height
+        },
+        clearColor: function (red: number, green: number, blue: number, alpha: number) {
+            colorClearValue.r = red
+            colorClearValue.g = green
+            colorClearValue.b = blue
+            colorClearValue.a = alpha
+        },
+        clearDepth: function () { },
+        depthFunc: function () { },
+        enable: function () { },
+        disable: function () { },
+        frontFace: function () { },
+        cullFace: function () { },
+        activeTexture: function () { },
+        createTexture: function () {
+            const id = getNextId()
+            items[id] = {
+                which: 'texture',
+            };
+            return id;
+        },
+        deleteTexture: function () { },
+        bindTexture: function (target: number, texture: WebGLTexture | null) {
+            boundTextures[target as number] = texture;
+        },
+        texParameterf: function () { },
+        texParameteri: function () { },
+        pixelStorei: function () { },
+        texImage2D: function () { },
+        texSubImage2D: function () { },
+        compressedTexImage2D: function () { },
+        useProgram: function () { },
+        getUniformLocation: function () {
+            return 0;
+        },
+        getActiveUniform: function (program: WebGLProgram, index: number) {
+            return {
+                size: 1,
+                type: gl.INT_VEC3,
+                name: `activeUniform${index}`,
+            };
+        },
+        getActiveAttrib: function (program: WebGLProgram, index: number) {
+            return {
+                size: 1,
+                type: gl.FLOAT,
+                name: `activeAttrib${index}`
+            };
+        },
+        clear: function () { },
+        uniform1f: function () { },
+        uniform1fv: function () { },
+        uniform1i: function () { },
+        uniform1iv: function () { },
+        uniform2f: function () { },
+        uniform2fv: function () { },
+        uniform2i: function () { },
+        uniform2iv: function () { },
+        uniform3f: function () { },
+        uniform3fv: function () { },
+        uniform3i: function () { },
+        uniform3iv: function () { },
+        uniform4f: function () { },
+        uniform4fv: function () { },
+        uniform4i: function () { },
+        uniform4iv: function () { },
+        uniformMatrix2fv: function () { },
+        uniformMatrix3fv: function () { },
+        uniformMatrix4fv: function () { },
+        getAttribLocation: function () { return 1 },
+        vertexAttribPointer: function () { },
+        enableVertexAttribArray: function () { },
+        disableVertexAttribArray: function () { },
+        drawElements: function () { },
+        drawArrays: function () { },
+        depthMask: function () { },
+        depthRange: function (zNear: number, zFar: number) {
+            depthRange.zNear = zNear
+            depthRange.zFar = zFar
+        },
+        bufferSubData: function () { },
+        blendFunc: function () { },
+        createFramebuffer: function () {
+            const id = getNextId()
+            items[id] = {
+                which: 'framebuffer',
+                shaders: [],
+            };
+            return id;
+        },
+        bindFramebuffer: function () { },
+        framebufferTexture2D: function () { },
+        checkFramebufferStatus: function () {
+            return gl.FRAMEBUFFER_COMPLETE;
+        },
+        deleteFramebuffer: function () { },
+        createRenderbuffer: function () {
+            const id = getNextId()
+            items[id] = {
+                which: 'renderbuffer',
+                shaders: [],
+            };
+            return id;
+        },
+        bindRenderbuffer: function () { },
+        deleteRenderbuffer: function () { },
+        renderbufferStorage: function () { },
+        framebufferRenderbuffer: function () { },
+        scissor: function () { },
+        colorMask: function () { },
+        lineWidth: function () { },
+        vertexAttrib1f: function () { },
+        vertexAttrib1fv: function () { },
+        vertexAttrib2f: function () { },
+        vertexAttrib2fv: function () { },
+        vertexAttrib3f: function () { },
+        vertexAttrib3fv: function () { },
+        vertexAttrib4f: function () { },
+        vertexAttrib4fv: function () { },
+        validateProgram: function () { },
+        generateMipmap: function () { },
+        isContextLost: function () { return false; },
+        drawingBufferWidth: 1024,
+        drawingBufferHeight: 1024,
+        blendColor: function () { },
+        blendEquation: function () { },
+        blendEquationSeparate: function () { },
+        blendFuncSeparate: function () { },
+        clearStencil: function () { },
+        compressedTexSubImage2D: function () { },
+        copyTexImage2D: function () { },
+        copyTexSubImage2D: function () { },
+        detachShader: function () { },
+        finish: function () { },
+        flush: function () { },
+        getError: function () { return 0; },
+        polygonOffset: function () { },
+        readPixels: function () { },
+        sampleCoverage: function () { },
+        stencilFunc: function () { },
+        stencilFuncSeparate: function () { },
+        stencilMask: function () { },
+        stencilMaskSeparate: function () { },
+        stencilOp: function () { },
+        stencilOpSeparate: function () { },
+    }
+}
\ No newline at end of file
diff --git a/src/mol-gl/_spec/renderer.spec.ts b/src/mol-gl/_spec/renderer.spec.ts
index fc669697a..1384ff63b 100644
--- a/src/mol-gl/_spec/renderer.spec.ts
+++ b/src/mol-gl/_spec/renderer.spec.ts
@@ -4,7 +4,7 @@
  * @author Alexander Rose <alexander.rose@weirdbyte.de>
  */
 
-import createGl = require('gl');
+import { createGl } from './gl.shim';
 
 import { PerspectiveCamera } from 'mol-view/camera/perspective';
 import { Vec3, Mat4 } from 'mol-math/linear-algebra';
@@ -17,16 +17,16 @@ import { createUniformColor } from 'mol-geo/util/color-data';
 import { createUniformSize } from 'mol-geo/util/size-data';
 import { createContext } from '../webgl/context';
 
-function writeImage(gl: WebGLRenderingContext, width: number, height: number) {
-    const pixels = new Uint8Array(width * height * 4)
-    gl.readPixels(0, 0, width, height, gl.RGBA, gl.UNSIGNED_BYTE, pixels)
-    process.stdout.write(['P3\n# gl.ppm\n', width, ' ', height, '\n255\n'].join(''))
-    for (let i = 0; i<pixels.length; i+=4) {
-        for (let j = 0; j<3; ++j) {
-            process.stdout.write(pixels[i+j] + ' ')
-        }
-    }
-}
+// function writeImage(gl: WebGLRenderingContext, width: number, height: number) {
+//     const pixels = new Uint8Array(width * height * 4)
+//     gl.readPixels(0, 0, width, height, gl.RGBA, gl.UNSIGNED_BYTE, pixels)
+//     process.stdout.write(['P3\n# gl.ppm\n', width, ' ', height, '\n255\n'].join(''))
+//     for (let i = 0; i<pixels.length; i+=4) {
+//         for (let j = 0; j<3; ++j) {
+//             process.stdout.write(pixels[i+j] + ' ')
+//         }
+//     }
+// }
 
 function createRenderer(gl: WebGLRenderingContext) {
     const ctx = createContext(gl)
@@ -35,7 +35,8 @@ function createRenderer(gl: WebGLRenderingContext) {
         far: 10000,
         position: Vec3.create(0, 0, 50)
     })
-    return Renderer.create(ctx, camera)
+    const renderer = Renderer.create(ctx, camera)
+    return { ctx, camera, renderer }
 }
 
 function createPoints() {
@@ -52,6 +53,7 @@ function createPoints() {
         objectId: 0,
         alpha: 1.0,
         visible: true,
+        depthMask: true,
 
         position,
         id,
@@ -65,18 +67,52 @@ function createPoints() {
     })
 }
 
-// TODO not working
-// - shaders not transformed via glslify
-describe.skip('renderer', () => {
+describe('renderer', () => {
     it('basic', () => {
         const [ width, height ] = [ 32, 32 ]
         const gl = createGl(width, height, { preserveDrawingBuffer: true })
-        const renderer = createRenderer(gl)
+        const { ctx, renderer } = createRenderer(gl)
+
+        expect(ctx.gl.canvas.width).toBe(32)
+        expect(ctx.gl.canvas.height).toBe(32)
+
+        expect(ctx.bufferCount).toBe(0);
+        expect(ctx.textureCount).toBe(0);
+        expect(ctx.vaoCount).toBe(0);
+        expect(ctx.programCache.count).toBe(0);
+        expect(ctx.shaderCache.count).toBe(0);
+
+        renderer.setViewport({ x: 0, y: 0, width: 64, height: 48 })
+        expect(ctx.gl.getParameter(ctx.gl.VIEWPORT)[2]).toBe(64)
+        expect(ctx.gl.getParameter(ctx.gl.VIEWPORT)[3]).toBe(48)
+    })
+
+    it('points', () => {
+        const [ width, height ] = [ 32, 32 ]
+        const gl = createGl(width, height, { preserveDrawingBuffer: true })
+        const { ctx, renderer } = createRenderer(gl)
+
         const points = createPoints()
 
         renderer.add(points)
-        renderer.draw()
+        expect(ctx.bufferCount).toBe(4);
+        expect(ctx.textureCount).toBe(0);
+        expect(ctx.vaoCount).toBe(1);
+        expect(ctx.programCache.count).toBe(1);
+        expect(ctx.shaderCache.count).toBe(2);
+
+        renderer.remove(points)
+        expect(ctx.bufferCount).toBe(0);
+        expect(ctx.textureCount).toBe(0);
+        expect(ctx.vaoCount).toBe(0);
+        expect(ctx.programCache.count).toBe(1);
+        expect(ctx.shaderCache.count).toBe(2);
+
+        ctx.programCache.dispose()
+        expect(ctx.programCache.count).toBe(0);
 
-        writeImage(gl, width, height)
+        ctx.shaderCache.clear()
+        expect(ctx.shaderCache.count).toBe(0);
+        // console.log('moin', ctx)
     })
 })
\ No newline at end of file
diff --git a/src/mol-gl/gl.d.ts b/src/mol-gl/gl.d.ts
deleted file mode 100644
index 4c5976679..000000000
--- a/src/mol-gl/gl.d.ts
+++ /dev/null
@@ -1,904 +0,0 @@
-// Type definitions for gl 4.0.4
-// Project: headless-gl
-// Definitions by: Ivan Perevezentsev (https://github.com/ip)
-
-declare module 'gl' {
-
-    /*~ Note that ES6 modules cannot directly export callable functions.
-    *~ This file should be imported using the CommonJS-style:
-    *~   import x = require('someLibrary');
-    *~
-    *~ Refer to the documentation to understand common
-    *~ workarounds for this limitation of ES6 modules.
-    */
-
-    /*~ This declaration specifies that the function
-    *~ is the exported object from the file
-    */
-    export = createWebglContext;
-
-    function createWebglContext(
-      width: number,
-      height: number,
-      options?: WebGLContextAttributes): WebGLRenderingContext;
-  }
-
-  interface WebGLContextAttributes {
-    failIfMajorPerformanceCaveat?: boolean;
-    alpha?: boolean;
-    antialias?: boolean;
-    depth?: boolean;
-    premultipliedAlpha?: boolean;
-    preserveDrawingBuffer?: boolean;
-    stencil?: boolean;
-  }
-
-  interface WEBGL_compressed_texture_s3tc {
-      readonly COMPRESSED_RGB_S3TC_DXT1_EXT: number;
-      readonly COMPRESSED_RGBA_S3TC_DXT1_EXT: number;
-      readonly COMPRESSED_RGBA_S3TC_DXT3_EXT: number;
-      readonly COMPRESSED_RGBA_S3TC_DXT5_EXT: number;
-  }
-
-  declare var WEBGL_compressed_texture_s3tc: {
-      prototype: WEBGL_compressed_texture_s3tc;
-      new(): WEBGL_compressed_texture_s3tc;
-      readonly COMPRESSED_RGB_S3TC_DXT1_EXT: number;
-      readonly COMPRESSED_RGBA_S3TC_DXT1_EXT: number;
-      readonly COMPRESSED_RGBA_S3TC_DXT3_EXT: number;
-      readonly COMPRESSED_RGBA_S3TC_DXT5_EXT: number;
-  };
-
-  interface WEBGL_debug_renderer_info {
-      readonly UNMASKED_RENDERER_WEBGL: number;
-      readonly UNMASKED_VENDOR_WEBGL: number;
-  }
-
-  declare var WEBGL_debug_renderer_info: {
-      prototype: WEBGL_debug_renderer_info;
-      new(): WEBGL_debug_renderer_info;
-      readonly UNMASKED_RENDERER_WEBGL: number;
-      readonly UNMASKED_VENDOR_WEBGL: number;
-  };
-
-  interface WEBGL_depth_texture {
-      readonly UNSIGNED_INT_24_8_WEBGL: number;
-  }
-
-  declare var WEBGL_depth_texture: {
-      prototype: WEBGL_depth_texture;
-      new(): WEBGL_depth_texture;
-      readonly UNSIGNED_INT_24_8_WEBGL: number;
-  };
-
-  interface WebGLActiveInfo {
-      readonly name: string;
-      readonly size: number;
-      readonly type: number;
-  }
-
-  declare var WebGLActiveInfo: {
-      prototype: WebGLActiveInfo;
-      new(): WebGLActiveInfo;
-  };
-
-  interface WebGLBuffer extends WebGLObject {
-  }
-
-  declare var WebGLBuffer: {
-      prototype: WebGLBuffer;
-      new(): WebGLBuffer;
-  };
-
-  // interface WebGLContextEvent extends Event {
-  //     readonly statusMessage: string;
-  // }
-
-  interface WebGLFramebuffer extends WebGLObject {
-  }
-
-  declare var WebGLFramebuffer: {
-      prototype: WebGLFramebuffer;
-      new(): WebGLFramebuffer;
-  };
-
-  interface WebGLObject {
-  }
-
-  declare var WebGLObject: {
-      prototype: WebGLObject;
-      new(): WebGLObject;
-  };
-
-  interface WebGLProgram extends WebGLObject {
-  }
-
-  declare var WebGLProgram: {
-      prototype: WebGLProgram;
-      new(): WebGLProgram;
-  };
-
-  interface WebGLRenderbuffer extends WebGLObject {
-  }
-
-  declare var WebGLRenderbuffer: {
-      prototype: WebGLRenderbuffer;
-      new(): WebGLRenderbuffer;
-  };
-
-  interface WebGLRenderingContext {
-      readonly drawingBufferHeight: number;
-      readonly drawingBufferWidth: number;
-      activeTexture(texture: number): void;
-      attachShader(program: WebGLProgram | null, shader: WebGLShader | null): void;
-      bindAttribLocation(program: WebGLProgram | null, index: number, name: string): void;
-      bindBuffer(target: number, buffer: WebGLBuffer | null): void;
-      bindFramebuffer(target: number, framebuffer: WebGLFramebuffer | null): void;
-      bindRenderbuffer(target: number, renderbuffer: WebGLRenderbuffer | null): void;
-      bindTexture(target: number, texture: WebGLTexture | null): void;
-      blendColor(red: number, green: number, blue: number, alpha: number): void;
-      blendEquation(mode: number): void;
-      blendEquationSeparate(modeRGB: number, modeAlpha: number): void;
-      blendFunc(sfactor: number, dfactor: number): void;
-      blendFuncSeparate(srcRGB: number, dstRGB: number, srcAlpha: number, dstAlpha: number): void;
-      bufferData(target: number, size: number | ArrayBufferView | ArrayBuffer, usage: number): void;
-      bufferSubData(target: number, offset: number, data: ArrayBufferView | ArrayBuffer): void;
-      checkFramebufferStatus(target: number): number;
-      clear(mask: number): void;
-      clearColor(red: number, green: number, blue: number, alpha: number): void;
-      clearDepth(depth: number): void;
-      clearStencil(s: number): void;
-      colorMask(red: boolean, green: boolean, blue: boolean, alpha: boolean): void;
-      compileShader(shader: WebGLShader | null): void;
-      compressedTexImage2D(target: number, level: number, internalformat: number, width: number, height: number, border: number, data: ArrayBufferView): void;
-      compressedTexSubImage2D(target: number, level: number, xoffset: number, yoffset: number, width: number, height: number, format: number, data: ArrayBufferView): void;
-      copyTexImage2D(target: number, level: number, internalformat: number, x: number, y: number, width: number, height: number, border: number): void;
-      copyTexSubImage2D(target: number, level: number, xoffset: number, yoffset: number, x: number, y: number, width: number, height: number): void;
-      createBuffer(): WebGLBuffer | null;
-      createFramebuffer(): WebGLFramebuffer | null;
-      createProgram(): WebGLProgram | null;
-      createRenderbuffer(): WebGLRenderbuffer | null;
-      createShader(type: number): WebGLShader | null;
-      createTexture(): WebGLTexture | null;
-      cullFace(mode: number): void;
-      deleteBuffer(buffer: WebGLBuffer | null): void;
-      deleteFramebuffer(framebuffer: WebGLFramebuffer | null): void;
-      deleteProgram(program: WebGLProgram | null): void;
-      deleteRenderbuffer(renderbuffer: WebGLRenderbuffer | null): void;
-      deleteShader(shader: WebGLShader | null): void;
-      deleteTexture(texture: WebGLTexture | null): void;
-      depthFunc(func: number): void;
-      depthMask(flag: boolean): void;
-      depthRange(zNear: number, zFar: number): void;
-      detachShader(program: WebGLProgram | null, shader: WebGLShader | null): void;
-      disable(cap: number): void;
-      disableVertexAttribArray(index: number): void;
-      drawArrays(mode: number, first: number, count: number): void;
-      drawElements(mode: number, count: number, type: number, offset: number): void;
-      enable(cap: number): void;
-      enableVertexAttribArray(index: number): void;
-      finish(): void;
-      flush(): void;
-      framebufferRenderbuffer(target: number, attachment: number, renderbuffertarget: number, renderbuffer: WebGLRenderbuffer | null): void;
-      framebufferTexture2D(target: number, attachment: number, textarget: number, texture: WebGLTexture | null, level: number): void;
-      frontFace(mode: number): void;
-      generateMipmap(target: number): void;
-      getActiveAttrib(program: WebGLProgram | null, index: number): WebGLActiveInfo | null;
-      getActiveUniform(program: WebGLProgram | null, index: number): WebGLActiveInfo | null;
-      getAttachedShaders(program: WebGLProgram | null): WebGLShader[] | null;
-      getAttribLocation(program: WebGLProgram | null, name: string): number;
-      getBufferParameter(target: number, pname: number): any;
-      getContextAttributes(): WebGLContextAttributes;
-      getError(): number;
-      getExtension(name: string): any;
-      getFramebufferAttachmentParameter(target: number, attachment: number, pname: number): any;
-      getParameter(pname: number): any;
-      getProgramInfoLog(program: WebGLProgram | null): string | null;
-      getProgramParameter(program: WebGLProgram | null, pname: number): any;
-      getRenderbufferParameter(target: number, pname: number): any;
-      getShaderInfoLog(shader: WebGLShader | null): string | null;
-      getShaderParameter(shader: WebGLShader | null, pname: number): any;
-      getShaderPrecisionFormat(shadertype: number, precisiontype: number): WebGLShaderPrecisionFormat | null;
-      getShaderSource(shader: WebGLShader | null): string | null;
-      getSupportedExtensions(): string[] | null;
-      getTexParameter(target: number, pname: number): any;
-      getUniform(program: WebGLProgram | null, location: WebGLUniformLocation | null): any;
-      getUniformLocation(program: WebGLProgram | null, name: string): WebGLUniformLocation | null;
-      getVertexAttrib(index: number, pname: number): any;
-      getVertexAttribOffset(index: number, pname: number): number;
-      hint(target: number, mode: number): void;
-      isBuffer(buffer: WebGLBuffer | null): boolean;
-      isContextLost(): boolean;
-      isEnabled(cap: number): boolean;
-      isFramebuffer(framebuffer: WebGLFramebuffer | null): boolean;
-      isProgram(program: WebGLProgram | null): boolean;
-      isRenderbuffer(renderbuffer: WebGLRenderbuffer | null): boolean;
-      isShader(shader: WebGLShader | null): boolean;
-      isTexture(texture: WebGLTexture | null): boolean;
-      lineWidth(width: number): void;
-      linkProgram(program: WebGLProgram | null): void;
-      pixelStorei(pname: number, param: number | boolean): void;
-      polygonOffset(factor: number, units: number): void;
-      readPixels(x: number, y: number, width: number, height: number, format: number, type: number, pixels: ArrayBufferView | null): void;
-      renderbufferStorage(target: number, internalformat: number, width: number, height: number): void;
-      sampleCoverage(value: number, invert: boolean): void;
-      scissor(x: number, y: number, width: number, height: number): void;
-      shaderSource(shader: WebGLShader | null, source: string): void;
-      stencilFunc(func: number, ref: number, mask: number): void;
-      stencilFuncSeparate(face: number, func: number, ref: number, mask: number): void;
-      stencilMask(mask: number): void;
-      stencilMaskSeparate(face: number, mask: number): void;
-      stencilOp(fail: number, zfail: number, zpass: number): void;
-      stencilOpSeparate(face: number, fail: number, zfail: number, zpass: number): void;
-      texImage2D(target: number, level: number, internalformat: number, width: number, height: number, border: number, format: number, type: number, pixels: ArrayBufferView | null): void;
-      // texImage2D(target: number, level: number, internalformat: number, format: number, type: number, pixels: ImageBitmap | ImageData | HTMLVideoElement | HTMLImageElement | HTMLCanvasElement): void;
-      texParameterf(target: number, pname: number, param: number): void;
-      texParameteri(target: number, pname: number, param: number): void;
-      texSubImage2D(target: number, level: number, xoffset: number, yoffset: number, width: number, height: number, format: number, type: number, pixels: ArrayBufferView | null): void;
-      // texSubImage2D(target: number, level: number, xoffset: number, yoffset: number, format: number, type: number, pixels: ImageBitmap | ImageData | HTMLVideoElement | HTMLImageElement | HTMLCanvasElement): void;
-      uniform1f(location: WebGLUniformLocation | null, x: number): void;
-      uniform1fv(location: WebGLUniformLocation, v: Float32Array | number[]): void;
-      uniform1i(location: WebGLUniformLocation | null, x: number): void;
-      uniform1iv(location: WebGLUniformLocation, v: Int32Array | number[]): void;
-      uniform2f(location: WebGLUniformLocation | null, x: number, y: number): void;
-      uniform2fv(location: WebGLUniformLocation, v: Float32Array | number[]): void;
-      uniform2i(location: WebGLUniformLocation | null, x: number, y: number): void;
-      uniform2iv(location: WebGLUniformLocation, v: Int32Array | number[]): void;
-      uniform3f(location: WebGLUniformLocation | null, x: number, y: number, z: number): void;
-      uniform3fv(location: WebGLUniformLocation, v: Float32Array | number[]): void;
-      uniform3i(location: WebGLUniformLocation | null, x: number, y: number, z: number): void;
-      uniform3iv(location: WebGLUniformLocation, v: Int32Array | number[]): void;
-      uniform4f(location: WebGLUniformLocation | null, x: number, y: number, z: number, w: number): void;
-      uniform4fv(location: WebGLUniformLocation, v: Float32Array | number[]): void;
-      uniform4i(location: WebGLUniformLocation | null, x: number, y: number, z: number, w: number): void;
-      uniform4iv(location: WebGLUniformLocation, v: Int32Array | number[]): void;
-      uniformMatrix2fv(location: WebGLUniformLocation, transpose: boolean, value: Float32Array | number[]): void;
-      uniformMatrix3fv(location: WebGLUniformLocation, transpose: boolean, value: Float32Array | number[]): void;
-      uniformMatrix4fv(location: WebGLUniformLocation, transpose: boolean, value: Float32Array | number[]): void;
-      useProgram(program: WebGLProgram | null): void;
-      validateProgram(program: WebGLProgram | null): void;
-      vertexAttrib1f(indx: number, x: number): void;
-      vertexAttrib1fv(indx: number, values: Float32Array | number[]): void;
-      vertexAttrib2f(indx: number, x: number, y: number): void;
-      vertexAttrib2fv(indx: number, values: Float32Array | number[]): void;
-      vertexAttrib3f(indx: number, x: number, y: number, z: number): void;
-      vertexAttrib3fv(indx: number, values: Float32Array | number[]): void;
-      vertexAttrib4f(indx: number, x: number, y: number, z: number, w: number): void;
-      vertexAttrib4fv(indx: number, values: Float32Array | number[]): void;
-      vertexAttribPointer(indx: number, size: number, type: number, normalized: boolean, stride: number, offset: number): void;
-      viewport(x: number, y: number, width: number, height: number): void;
-      readonly ACTIVE_ATTRIBUTES: number;
-      readonly ACTIVE_TEXTURE: number;
-      readonly ACTIVE_UNIFORMS: number;
-      readonly ALIASED_LINE_WIDTH_RANGE: number;
-      readonly ALIASED_POINT_SIZE_RANGE: number;
-      readonly ALPHA: number;
-      readonly ALPHA_BITS: number;
-      readonly ALWAYS: number;
-      readonly ARRAY_BUFFER: number;
-      readonly ARRAY_BUFFER_BINDING: number;
-      readonly ATTACHED_SHADERS: number;
-      readonly BACK: number;
-      readonly BLEND: number;
-      readonly BLEND_COLOR: number;
-      readonly BLEND_DST_ALPHA: number;
-      readonly BLEND_DST_RGB: number;
-      readonly BLEND_EQUATION: number;
-      readonly BLEND_EQUATION_ALPHA: number;
-      readonly BLEND_EQUATION_RGB: number;
-      readonly BLEND_SRC_ALPHA: number;
-      readonly BLEND_SRC_RGB: number;
-      readonly BLUE_BITS: number;
-      readonly BOOL: number;
-      readonly BOOL_VEC2: number;
-      readonly BOOL_VEC3: number;
-      readonly BOOL_VEC4: number;
-      readonly BROWSER_DEFAULT_WEBGL: number;
-      readonly BUFFER_SIZE: number;
-      readonly BUFFER_USAGE: number;
-      readonly BYTE: number;
-      readonly CCW: number;
-      readonly CLAMP_TO_EDGE: number;
-      readonly COLOR_ATTACHMENT0: number;
-      readonly COLOR_BUFFER_BIT: number;
-      readonly COLOR_CLEAR_VALUE: number;
-      readonly COLOR_WRITEMASK: number;
-      readonly COMPILE_STATUS: number;
-      readonly COMPRESSED_TEXTURE_FORMATS: number;
-      readonly CONSTANT_ALPHA: number;
-      readonly CONSTANT_COLOR: number;
-      readonly CONTEXT_LOST_WEBGL: number;
-      readonly CULL_FACE: number;
-      readonly CULL_FACE_MODE: number;
-      readonly CURRENT_PROGRAM: number;
-      readonly CURRENT_VERTEX_ATTRIB: number;
-      readonly CW: number;
-      readonly DECR: number;
-      readonly DECR_WRAP: number;
-      readonly DELETE_STATUS: number;
-      readonly DEPTH_ATTACHMENT: number;
-      readonly DEPTH_BITS: number;
-      readonly DEPTH_BUFFER_BIT: number;
-      readonly DEPTH_CLEAR_VALUE: number;
-      readonly DEPTH_COMPONENT: number;
-      readonly DEPTH_COMPONENT16: number;
-      readonly DEPTH_FUNC: number;
-      readonly DEPTH_RANGE: number;
-      readonly DEPTH_STENCIL: number;
-      readonly DEPTH_STENCIL_ATTACHMENT: number;
-      readonly DEPTH_TEST: number;
-      readonly DEPTH_WRITEMASK: number;
-      readonly DITHER: number;
-      readonly DONT_CARE: number;
-      readonly DST_ALPHA: number;
-      readonly DST_COLOR: number;
-      readonly DYNAMIC_DRAW: number;
-      readonly ELEMENT_ARRAY_BUFFER: number;
-      readonly ELEMENT_ARRAY_BUFFER_BINDING: number;
-      readonly EQUAL: number;
-      readonly FASTEST: number;
-      readonly FLOAT: number;
-      readonly FLOAT_MAT2: number;
-      readonly FLOAT_MAT3: number;
-      readonly FLOAT_MAT4: number;
-      readonly FLOAT_VEC2: number;
-      readonly FLOAT_VEC3: number;
-      readonly FLOAT_VEC4: number;
-      readonly FRAGMENT_SHADER: number;
-      readonly FRAMEBUFFER: number;
-      readonly FRAMEBUFFER_ATTACHMENT_OBJECT_NAME: number;
-      readonly FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE: number;
-      readonly FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE: number;
-      readonly FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL: number;
-      readonly FRAMEBUFFER_BINDING: number;
-      readonly FRAMEBUFFER_COMPLETE: number;
-      readonly FRAMEBUFFER_INCOMPLETE_ATTACHMENT: number;
-      readonly FRAMEBUFFER_INCOMPLETE_DIMENSIONS: number;
-      readonly FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: number;
-      readonly FRAMEBUFFER_UNSUPPORTED: number;
-      readonly FRONT: number;
-      readonly FRONT_AND_BACK: number;
-      readonly FRONT_FACE: number;
-      readonly FUNC_ADD: number;
-      readonly FUNC_REVERSE_SUBTRACT: number;
-      readonly FUNC_SUBTRACT: number;
-      readonly GENERATE_MIPMAP_HINT: number;
-      readonly GEQUAL: number;
-      readonly GREATER: number;
-      readonly GREEN_BITS: number;
-      readonly HIGH_FLOAT: number;
-      readonly HIGH_INT: number;
-      readonly IMPLEMENTATION_COLOR_READ_FORMAT: number;
-      readonly IMPLEMENTATION_COLOR_READ_TYPE: number;
-      readonly INCR: number;
-      readonly INCR_WRAP: number;
-      readonly INT: number;
-      readonly INT_VEC2: number;
-      readonly INT_VEC3: number;
-      readonly INT_VEC4: number;
-      readonly INVALID_ENUM: number;
-      readonly INVALID_FRAMEBUFFER_OPERATION: number;
-      readonly INVALID_OPERATION: number;
-      readonly INVALID_VALUE: number;
-      readonly INVERT: number;
-      readonly KEEP: number;
-      readonly LEQUAL: number;
-      readonly LESS: number;
-      readonly LINE_LOOP: number;
-      readonly LINE_STRIP: number;
-      readonly LINE_WIDTH: number;
-      readonly LINEAR: number;
-      readonly LINEAR_MIPMAP_LINEAR: number;
-      readonly LINEAR_MIPMAP_NEAREST: number;
-      readonly LINES: number;
-      readonly LINK_STATUS: number;
-      readonly LOW_FLOAT: number;
-      readonly LOW_INT: number;
-      readonly LUMINANCE: number;
-      readonly LUMINANCE_ALPHA: number;
-      readonly MAX_COMBINED_TEXTURE_IMAGE_UNITS: number;
-      readonly MAX_CUBE_MAP_TEXTURE_SIZE: number;
-      readonly MAX_FRAGMENT_UNIFORM_VECTORS: number;
-      readonly MAX_RENDERBUFFER_SIZE: number;
-      readonly MAX_TEXTURE_IMAGE_UNITS: number;
-      readonly MAX_TEXTURE_SIZE: number;
-      readonly MAX_VARYING_VECTORS: number;
-      readonly MAX_VERTEX_ATTRIBS: number;
-      readonly MAX_VERTEX_TEXTURE_IMAGE_UNITS: number;
-      readonly MAX_VERTEX_UNIFORM_VECTORS: number;
-      readonly MAX_VIEWPORT_DIMS: number;
-      readonly MEDIUM_FLOAT: number;
-      readonly MEDIUM_INT: number;
-      readonly MIRRORED_REPEAT: number;
-      readonly NEAREST: number;
-      readonly NEAREST_MIPMAP_LINEAR: number;
-      readonly NEAREST_MIPMAP_NEAREST: number;
-      readonly NEVER: number;
-      readonly NICEST: number;
-      readonly NO_ERROR: number;
-      readonly NONE: number;
-      readonly NOTEQUAL: number;
-      readonly ONE: number;
-      readonly ONE_MINUS_CONSTANT_ALPHA: number;
-      readonly ONE_MINUS_CONSTANT_COLOR: number;
-      readonly ONE_MINUS_DST_ALPHA: number;
-      readonly ONE_MINUS_DST_COLOR: number;
-      readonly ONE_MINUS_SRC_ALPHA: number;
-      readonly ONE_MINUS_SRC_COLOR: number;
-      readonly OUT_OF_MEMORY: number;
-      readonly PACK_ALIGNMENT: number;
-      readonly POINTS: number;
-      readonly POLYGON_OFFSET_FACTOR: number;
-      readonly POLYGON_OFFSET_FILL: number;
-      readonly POLYGON_OFFSET_UNITS: number;
-      readonly RED_BITS: number;
-      readonly RENDERBUFFER: number;
-      readonly RENDERBUFFER_ALPHA_SIZE: number;
-      readonly RENDERBUFFER_BINDING: number;
-      readonly RENDERBUFFER_BLUE_SIZE: number;
-      readonly RENDERBUFFER_DEPTH_SIZE: number;
-      readonly RENDERBUFFER_GREEN_SIZE: number;
-      readonly RENDERBUFFER_HEIGHT: number;
-      readonly RENDERBUFFER_INTERNAL_FORMAT: number;
-      readonly RENDERBUFFER_RED_SIZE: number;
-      readonly RENDERBUFFER_STENCIL_SIZE: number;
-      readonly RENDERBUFFER_WIDTH: number;
-      readonly RENDERER: number;
-      readonly REPEAT: number;
-      readonly REPLACE: number;
-      readonly RGB: number;
-      readonly RGB5_A1: number;
-      readonly RGB565: number;
-      readonly RGBA: number;
-      readonly RGBA4: number;
-      readonly SAMPLE_ALPHA_TO_COVERAGE: number;
-      readonly SAMPLE_BUFFERS: number;
-      readonly SAMPLE_COVERAGE: number;
-      readonly SAMPLE_COVERAGE_INVERT: number;
-      readonly SAMPLE_COVERAGE_VALUE: number;
-      readonly SAMPLER_2D: number;
-      readonly SAMPLER_CUBE: number;
-      readonly SAMPLES: number;
-      readonly SCISSOR_BOX: number;
-      readonly SCISSOR_TEST: number;
-      readonly SHADER_TYPE: number;
-      readonly SHADING_LANGUAGE_VERSION: number;
-      readonly SHORT: number;
-      readonly SRC_ALPHA: number;
-      readonly SRC_ALPHA_SATURATE: number;
-      readonly SRC_COLOR: number;
-      readonly STATIC_DRAW: number;
-      readonly STENCIL_ATTACHMENT: number;
-      readonly STENCIL_BACK_FAIL: number;
-      readonly STENCIL_BACK_FUNC: number;
-      readonly STENCIL_BACK_PASS_DEPTH_FAIL: number;
-      readonly STENCIL_BACK_PASS_DEPTH_PASS: number;
-      readonly STENCIL_BACK_REF: number;
-      readonly STENCIL_BACK_VALUE_MASK: number;
-      readonly STENCIL_BACK_WRITEMASK: number;
-      readonly STENCIL_BITS: number;
-      readonly STENCIL_BUFFER_BIT: number;
-      readonly STENCIL_CLEAR_VALUE: number;
-      readonly STENCIL_FAIL: number;
-      readonly STENCIL_FUNC: number;
-      readonly STENCIL_INDEX: number;
-      readonly STENCIL_INDEX8: number;
-      readonly STENCIL_PASS_DEPTH_FAIL: number;
-      readonly STENCIL_PASS_DEPTH_PASS: number;
-      readonly STENCIL_REF: number;
-      readonly STENCIL_TEST: number;
-      readonly STENCIL_VALUE_MASK: number;
-      readonly STENCIL_WRITEMASK: number;
-      readonly STREAM_DRAW: number;
-      readonly SUBPIXEL_BITS: number;
-      readonly TEXTURE: number;
-      readonly TEXTURE_2D: number;
-      readonly TEXTURE_BINDING_2D: number;
-      readonly TEXTURE_BINDING_CUBE_MAP: number;
-      readonly TEXTURE_CUBE_MAP: number;
-      readonly TEXTURE_CUBE_MAP_NEGATIVE_X: number;
-      readonly TEXTURE_CUBE_MAP_NEGATIVE_Y: number;
-      readonly TEXTURE_CUBE_MAP_NEGATIVE_Z: number;
-      readonly TEXTURE_CUBE_MAP_POSITIVE_X: number;
-      readonly TEXTURE_CUBE_MAP_POSITIVE_Y: number;
-      readonly TEXTURE_CUBE_MAP_POSITIVE_Z: number;
-      readonly TEXTURE_MAG_FILTER: number;
-      readonly TEXTURE_MIN_FILTER: number;
-      readonly TEXTURE_WRAP_S: number;
-      readonly TEXTURE_WRAP_T: number;
-      readonly TEXTURE0: number;
-      readonly TEXTURE1: number;
-      readonly TEXTURE10: number;
-      readonly TEXTURE11: number;
-      readonly TEXTURE12: number;
-      readonly TEXTURE13: number;
-      readonly TEXTURE14: number;
-      readonly TEXTURE15: number;
-      readonly TEXTURE16: number;
-      readonly TEXTURE17: number;
-      readonly TEXTURE18: number;
-      readonly TEXTURE19: number;
-      readonly TEXTURE2: number;
-      readonly TEXTURE20: number;
-      readonly TEXTURE21: number;
-      readonly TEXTURE22: number;
-      readonly TEXTURE23: number;
-      readonly TEXTURE24: number;
-      readonly TEXTURE25: number;
-      readonly TEXTURE26: number;
-      readonly TEXTURE27: number;
-      readonly TEXTURE28: number;
-      readonly TEXTURE29: number;
-      readonly TEXTURE3: number;
-      readonly TEXTURE30: number;
-      readonly TEXTURE31: number;
-      readonly TEXTURE4: number;
-      readonly TEXTURE5: number;
-      readonly TEXTURE6: number;
-      readonly TEXTURE7: number;
-      readonly TEXTURE8: number;
-      readonly TEXTURE9: number;
-      readonly TRIANGLE_FAN: number;
-      readonly TRIANGLE_STRIP: number;
-      readonly TRIANGLES: number;
-      readonly UNPACK_ALIGNMENT: number;
-      readonly UNPACK_COLORSPACE_CONVERSION_WEBGL: number;
-      readonly UNPACK_FLIP_Y_WEBGL: number;
-      readonly UNPACK_PREMULTIPLY_ALPHA_WEBGL: number;
-      readonly UNSIGNED_BYTE: number;
-      readonly UNSIGNED_INT: number;
-      readonly UNSIGNED_SHORT: number;
-      readonly UNSIGNED_SHORT_4_4_4_4: number;
-      readonly UNSIGNED_SHORT_5_5_5_1: number;
-      readonly UNSIGNED_SHORT_5_6_5: number;
-      readonly VALIDATE_STATUS: number;
-      readonly VENDOR: number;
-      readonly VERSION: number;
-      readonly VERTEX_ATTRIB_ARRAY_BUFFER_BINDING: number;
-      readonly VERTEX_ATTRIB_ARRAY_ENABLED: number;
-      readonly VERTEX_ATTRIB_ARRAY_NORMALIZED: number;
-      readonly VERTEX_ATTRIB_ARRAY_POINTER: number;
-      readonly VERTEX_ATTRIB_ARRAY_SIZE: number;
-      readonly VERTEX_ATTRIB_ARRAY_STRIDE: number;
-      readonly VERTEX_ATTRIB_ARRAY_TYPE: number;
-      readonly VERTEX_SHADER: number;
-      readonly VIEWPORT: number;
-      readonly ZERO: number;
-  }
-
-  declare var WebGLRenderingContext: {
-      prototype: WebGLRenderingContext;
-      new(): WebGLRenderingContext;
-      readonly ACTIVE_ATTRIBUTES: number;
-      readonly ACTIVE_TEXTURE: number;
-      readonly ACTIVE_UNIFORMS: number;
-      readonly ALIASED_LINE_WIDTH_RANGE: number;
-      readonly ALIASED_POINT_SIZE_RANGE: number;
-      readonly ALPHA: number;
-      readonly ALPHA_BITS: number;
-      readonly ALWAYS: number;
-      readonly ARRAY_BUFFER: number;
-      readonly ARRAY_BUFFER_BINDING: number;
-      readonly ATTACHED_SHADERS: number;
-      readonly BACK: number;
-      readonly BLEND: number;
-      readonly BLEND_COLOR: number;
-      readonly BLEND_DST_ALPHA: number;
-      readonly BLEND_DST_RGB: number;
-      readonly BLEND_EQUATION: number;
-      readonly BLEND_EQUATION_ALPHA: number;
-      readonly BLEND_EQUATION_RGB: number;
-      readonly BLEND_SRC_ALPHA: number;
-      readonly BLEND_SRC_RGB: number;
-      readonly BLUE_BITS: number;
-      readonly BOOL: number;
-      readonly BOOL_VEC2: number;
-      readonly BOOL_VEC3: number;
-      readonly BOOL_VEC4: number;
-      readonly BROWSER_DEFAULT_WEBGL: number;
-      readonly BUFFER_SIZE: number;
-      readonly BUFFER_USAGE: number;
-      readonly BYTE: number;
-      readonly CCW: number;
-      readonly CLAMP_TO_EDGE: number;
-      readonly COLOR_ATTACHMENT0: number;
-      readonly COLOR_BUFFER_BIT: number;
-      readonly COLOR_CLEAR_VALUE: number;
-      readonly COLOR_WRITEMASK: number;
-      readonly COMPILE_STATUS: number;
-      readonly COMPRESSED_TEXTURE_FORMATS: number;
-      readonly CONSTANT_ALPHA: number;
-      readonly CONSTANT_COLOR: number;
-      readonly CONTEXT_LOST_WEBGL: number;
-      readonly CULL_FACE: number;
-      readonly CULL_FACE_MODE: number;
-      readonly CURRENT_PROGRAM: number;
-      readonly CURRENT_VERTEX_ATTRIB: number;
-      readonly CW: number;
-      readonly DECR: number;
-      readonly DECR_WRAP: number;
-      readonly DELETE_STATUS: number;
-      readonly DEPTH_ATTACHMENT: number;
-      readonly DEPTH_BITS: number;
-      readonly DEPTH_BUFFER_BIT: number;
-      readonly DEPTH_CLEAR_VALUE: number;
-      readonly DEPTH_COMPONENT: number;
-      readonly DEPTH_COMPONENT16: number;
-      readonly DEPTH_FUNC: number;
-      readonly DEPTH_RANGE: number;
-      readonly DEPTH_STENCIL: number;
-      readonly DEPTH_STENCIL_ATTACHMENT: number;
-      readonly DEPTH_TEST: number;
-      readonly DEPTH_WRITEMASK: number;
-      readonly DITHER: number;
-      readonly DONT_CARE: number;
-      readonly DST_ALPHA: number;
-      readonly DST_COLOR: number;
-      readonly DYNAMIC_DRAW: number;
-      readonly ELEMENT_ARRAY_BUFFER: number;
-      readonly ELEMENT_ARRAY_BUFFER_BINDING: number;
-      readonly EQUAL: number;
-      readonly FASTEST: number;
-      readonly FLOAT: number;
-      readonly FLOAT_MAT2: number;
-      readonly FLOAT_MAT3: number;
-      readonly FLOAT_MAT4: number;
-      readonly FLOAT_VEC2: number;
-      readonly FLOAT_VEC3: number;
-      readonly FLOAT_VEC4: number;
-      readonly FRAGMENT_SHADER: number;
-      readonly FRAMEBUFFER: number;
-      readonly FRAMEBUFFER_ATTACHMENT_OBJECT_NAME: number;
-      readonly FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE: number;
-      readonly FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE: number;
-      readonly FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL: number;
-      readonly FRAMEBUFFER_BINDING: number;
-      readonly FRAMEBUFFER_COMPLETE: number;
-      readonly FRAMEBUFFER_INCOMPLETE_ATTACHMENT: number;
-      readonly FRAMEBUFFER_INCOMPLETE_DIMENSIONS: number;
-      readonly FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: number;
-      readonly FRAMEBUFFER_UNSUPPORTED: number;
-      readonly FRONT: number;
-      readonly FRONT_AND_BACK: number;
-      readonly FRONT_FACE: number;
-      readonly FUNC_ADD: number;
-      readonly FUNC_REVERSE_SUBTRACT: number;
-      readonly FUNC_SUBTRACT: number;
-      readonly GENERATE_MIPMAP_HINT: number;
-      readonly GEQUAL: number;
-      readonly GREATER: number;
-      readonly GREEN_BITS: number;
-      readonly HIGH_FLOAT: number;
-      readonly HIGH_INT: number;
-      readonly IMPLEMENTATION_COLOR_READ_FORMAT: number;
-      readonly IMPLEMENTATION_COLOR_READ_TYPE: number;
-      readonly INCR: number;
-      readonly INCR_WRAP: number;
-      readonly INT: number;
-      readonly INT_VEC2: number;
-      readonly INT_VEC3: number;
-      readonly INT_VEC4: number;
-      readonly INVALID_ENUM: number;
-      readonly INVALID_FRAMEBUFFER_OPERATION: number;
-      readonly INVALID_OPERATION: number;
-      readonly INVALID_VALUE: number;
-      readonly INVERT: number;
-      readonly KEEP: number;
-      readonly LEQUAL: number;
-      readonly LESS: number;
-      readonly LINE_LOOP: number;
-      readonly LINE_STRIP: number;
-      readonly LINE_WIDTH: number;
-      readonly LINEAR: number;
-      readonly LINEAR_MIPMAP_LINEAR: number;
-      readonly LINEAR_MIPMAP_NEAREST: number;
-      readonly LINES: number;
-      readonly LINK_STATUS: number;
-      readonly LOW_FLOAT: number;
-      readonly LOW_INT: number;
-      readonly LUMINANCE: number;
-      readonly LUMINANCE_ALPHA: number;
-      readonly MAX_COMBINED_TEXTURE_IMAGE_UNITS: number;
-      readonly MAX_CUBE_MAP_TEXTURE_SIZE: number;
-      readonly MAX_FRAGMENT_UNIFORM_VECTORS: number;
-      readonly MAX_RENDERBUFFER_SIZE: number;
-      readonly MAX_TEXTURE_IMAGE_UNITS: number;
-      readonly MAX_TEXTURE_SIZE: number;
-      readonly MAX_VARYING_VECTORS: number;
-      readonly MAX_VERTEX_ATTRIBS: number;
-      readonly MAX_VERTEX_TEXTURE_IMAGE_UNITS: number;
-      readonly MAX_VERTEX_UNIFORM_VECTORS: number;
-      readonly MAX_VIEWPORT_DIMS: number;
-      readonly MEDIUM_FLOAT: number;
-      readonly MEDIUM_INT: number;
-      readonly MIRRORED_REPEAT: number;
-      readonly NEAREST: number;
-      readonly NEAREST_MIPMAP_LINEAR: number;
-      readonly NEAREST_MIPMAP_NEAREST: number;
-      readonly NEVER: number;
-      readonly NICEST: number;
-      readonly NO_ERROR: number;
-      readonly NONE: number;
-      readonly NOTEQUAL: number;
-      readonly ONE: number;
-      readonly ONE_MINUS_CONSTANT_ALPHA: number;
-      readonly ONE_MINUS_CONSTANT_COLOR: number;
-      readonly ONE_MINUS_DST_ALPHA: number;
-      readonly ONE_MINUS_DST_COLOR: number;
-      readonly ONE_MINUS_SRC_ALPHA: number;
-      readonly ONE_MINUS_SRC_COLOR: number;
-      readonly OUT_OF_MEMORY: number;
-      readonly PACK_ALIGNMENT: number;
-      readonly POINTS: number;
-      readonly POLYGON_OFFSET_FACTOR: number;
-      readonly POLYGON_OFFSET_FILL: number;
-      readonly POLYGON_OFFSET_UNITS: number;
-      readonly RED_BITS: number;
-      readonly RENDERBUFFER: number;
-      readonly RENDERBUFFER_ALPHA_SIZE: number;
-      readonly RENDERBUFFER_BINDING: number;
-      readonly RENDERBUFFER_BLUE_SIZE: number;
-      readonly RENDERBUFFER_DEPTH_SIZE: number;
-      readonly RENDERBUFFER_GREEN_SIZE: number;
-      readonly RENDERBUFFER_HEIGHT: number;
-      readonly RENDERBUFFER_INTERNAL_FORMAT: number;
-      readonly RENDERBUFFER_RED_SIZE: number;
-      readonly RENDERBUFFER_STENCIL_SIZE: number;
-      readonly RENDERBUFFER_WIDTH: number;
-      readonly RENDERER: number;
-      readonly REPEAT: number;
-      readonly REPLACE: number;
-      readonly RGB: number;
-      readonly RGB5_A1: number;
-      readonly RGB565: number;
-      readonly RGBA: number;
-      readonly RGBA4: number;
-      readonly SAMPLE_ALPHA_TO_COVERAGE: number;
-      readonly SAMPLE_BUFFERS: number;
-      readonly SAMPLE_COVERAGE: number;
-      readonly SAMPLE_COVERAGE_INVERT: number;
-      readonly SAMPLE_COVERAGE_VALUE: number;
-      readonly SAMPLER_2D: number;
-      readonly SAMPLER_CUBE: number;
-      readonly SAMPLES: number;
-      readonly SCISSOR_BOX: number;
-      readonly SCISSOR_TEST: number;
-      readonly SHADER_TYPE: number;
-      readonly SHADING_LANGUAGE_VERSION: number;
-      readonly SHORT: number;
-      readonly SRC_ALPHA: number;
-      readonly SRC_ALPHA_SATURATE: number;
-      readonly SRC_COLOR: number;
-      readonly STATIC_DRAW: number;
-      readonly STENCIL_ATTACHMENT: number;
-      readonly STENCIL_BACK_FAIL: number;
-      readonly STENCIL_BACK_FUNC: number;
-      readonly STENCIL_BACK_PASS_DEPTH_FAIL: number;
-      readonly STENCIL_BACK_PASS_DEPTH_PASS: number;
-      readonly STENCIL_BACK_REF: number;
-      readonly STENCIL_BACK_VALUE_MASK: number;
-      readonly STENCIL_BACK_WRITEMASK: number;
-      readonly STENCIL_BITS: number;
-      readonly STENCIL_BUFFER_BIT: number;
-      readonly STENCIL_CLEAR_VALUE: number;
-      readonly STENCIL_FAIL: number;
-      readonly STENCIL_FUNC: number;
-      readonly STENCIL_INDEX: number;
-      readonly STENCIL_INDEX8: number;
-      readonly STENCIL_PASS_DEPTH_FAIL: number;
-      readonly STENCIL_PASS_DEPTH_PASS: number;
-      readonly STENCIL_REF: number;
-      readonly STENCIL_TEST: number;
-      readonly STENCIL_VALUE_MASK: number;
-      readonly STENCIL_WRITEMASK: number;
-      readonly STREAM_DRAW: number;
-      readonly SUBPIXEL_BITS: number;
-      readonly TEXTURE: number;
-      readonly TEXTURE_2D: number;
-      readonly TEXTURE_BINDING_2D: number;
-      readonly TEXTURE_BINDING_CUBE_MAP: number;
-      readonly TEXTURE_CUBE_MAP: number;
-      readonly TEXTURE_CUBE_MAP_NEGATIVE_X: number;
-      readonly TEXTURE_CUBE_MAP_NEGATIVE_Y: number;
-      readonly TEXTURE_CUBE_MAP_NEGATIVE_Z: number;
-      readonly TEXTURE_CUBE_MAP_POSITIVE_X: number;
-      readonly TEXTURE_CUBE_MAP_POSITIVE_Y: number;
-      readonly TEXTURE_CUBE_MAP_POSITIVE_Z: number;
-      readonly TEXTURE_MAG_FILTER: number;
-      readonly TEXTURE_MIN_FILTER: number;
-      readonly TEXTURE_WRAP_S: number;
-      readonly TEXTURE_WRAP_T: number;
-      readonly TEXTURE0: number;
-      readonly TEXTURE1: number;
-      readonly TEXTURE10: number;
-      readonly TEXTURE11: number;
-      readonly TEXTURE12: number;
-      readonly TEXTURE13: number;
-      readonly TEXTURE14: number;
-      readonly TEXTURE15: number;
-      readonly TEXTURE16: number;
-      readonly TEXTURE17: number;
-      readonly TEXTURE18: number;
-      readonly TEXTURE19: number;
-      readonly TEXTURE2: number;
-      readonly TEXTURE20: number;
-      readonly TEXTURE21: number;
-      readonly TEXTURE22: number;
-      readonly TEXTURE23: number;
-      readonly TEXTURE24: number;
-      readonly TEXTURE25: number;
-      readonly TEXTURE26: number;
-      readonly TEXTURE27: number;
-      readonly TEXTURE28: number;
-      readonly TEXTURE29: number;
-      readonly TEXTURE3: number;
-      readonly TEXTURE30: number;
-      readonly TEXTURE31: number;
-      readonly TEXTURE4: number;
-      readonly TEXTURE5: number;
-      readonly TEXTURE6: number;
-      readonly TEXTURE7: number;
-      readonly TEXTURE8: number;
-      readonly TEXTURE9: number;
-      readonly TRIANGLE_FAN: number;
-      readonly TRIANGLE_STRIP: number;
-      readonly TRIANGLES: number;
-      readonly UNPACK_ALIGNMENT: number;
-      readonly UNPACK_COLORSPACE_CONVERSION_WEBGL: number;
-      readonly UNPACK_FLIP_Y_WEBGL: number;
-      readonly UNPACK_PREMULTIPLY_ALPHA_WEBGL: number;
-      readonly UNSIGNED_BYTE: number;
-      readonly UNSIGNED_INT: number;
-      readonly UNSIGNED_SHORT: number;
-      readonly UNSIGNED_SHORT_4_4_4_4: number;
-      readonly UNSIGNED_SHORT_5_5_5_1: number;
-      readonly UNSIGNED_SHORT_5_6_5: number;
-      readonly VALIDATE_STATUS: number;
-      readonly VENDOR: number;
-      readonly VERSION: number;
-      readonly VERTEX_ATTRIB_ARRAY_BUFFER_BINDING: number;
-      readonly VERTEX_ATTRIB_ARRAY_ENABLED: number;
-      readonly VERTEX_ATTRIB_ARRAY_NORMALIZED: number;
-      readonly VERTEX_ATTRIB_ARRAY_POINTER: number;
-      readonly VERTEX_ATTRIB_ARRAY_SIZE: number;
-      readonly VERTEX_ATTRIB_ARRAY_STRIDE: number;
-      readonly VERTEX_ATTRIB_ARRAY_TYPE: number;
-      readonly VERTEX_SHADER: number;
-      readonly VIEWPORT: number;
-      readonly ZERO: number;
-  };
-
-  interface WebGLShader extends WebGLObject {
-  }
-
-  declare var WebGLShader: {
-      prototype: WebGLShader;
-      new(): WebGLShader;
-  };
-
-  interface WebGLShaderPrecisionFormat {
-      readonly precision: number;
-      readonly rangeMax: number;
-      readonly rangeMin: number;
-  }
-
-  declare var WebGLShaderPrecisionFormat: {
-      prototype: WebGLShaderPrecisionFormat;
-      new(): WebGLShaderPrecisionFormat;
-  };
-
-  interface WebGLTexture extends WebGLObject {
-  }
-
-  declare var WebGLTexture: {
-      prototype: WebGLTexture;
-      new(): WebGLTexture;
-  };
-
-  interface WebGLUniformLocation {
-  }
-
-  declare var WebGLUniformLocation: {
-      prototype: WebGLUniformLocation;
-      new(): WebGLUniformLocation;
-  };
\ No newline at end of file
-- 
GitLab