UNPKG

webglimpse

Version:

Webglimpse is a data visualization library for the web.

99 lines 25.1 kB
import { newTextTextureCache6 } from '../text'; import { TextureRenderer } from '../texture'; import { Program, UniformColor, Attribute } from '../shader'; import { xyFrac_VERTSHADER, solid_FRAGSHADER } from '../misc'; import { ensureCapacityFloat32, GL, hasval } from '../util/util'; import { newDynamicBuffer } from '../buffer'; import { white } from '../color'; export function newTimeseriesAnnotationPainterFactory() { // Painter Factory return function (drawable, timeAxis, dataAxis, model, rowModel, ui) { const textTextures = newTextTextureCache6(); const textureRenderer = new TextureRenderer(); const program = new Program(xyFrac_VERTSHADER, solid_FRAGSHADER); const u_Color = new UniformColor(program, 'u_Color'); const a_Position = new Attribute(program, 'a_XyFrac'); let xys = new Float32Array(0); xys = ensureCapacityFloat32(xys, 4); const xysBuffer = newDynamicBuffer(); // Painter return function (gl, viewport) { gl.blendFuncSeparate(GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA, GL.ONE, GL.ONE_MINUS_SRC_ALPHA); gl.enable(GL.BLEND); textTextures.resetTouches(); let xFrac = 0; let yFrac = 0; for (let i = 0; i < rowModel.annotationGuids.length; i++) { const annotationGuid = rowModel.annotationGuids.valueAt(i); const annotation = model.annotation(annotationGuid); const annotationStyle = ui.annotationStyle(annotation.styleGuid); const font = hasval(annotationStyle.font) ? annotationStyle.font : '11px verdana,sans-serif'; const color = hasval(annotationStyle.color) ? annotationStyle.color : white; const bgColorString = hasval(annotationStyle.bgColor) ? annotationStyle.bgColor.rgbaString : '#ffffff00'; const bgPadding = hasval(annotationStyle.bgPadding) ? annotationStyle.bgPadding : 0; const bgBorderRadius = hasval(annotationStyle.bgBorderRadius) ? annotationStyle.bgBorderRadius : 0; const hTextOffset = hasval(annotationStyle.hTextOffset) ? annotationStyle.hTextOffset : 0; const vTextOffset = hasval(annotationStyle.vTextOffset) ? annotationStyle.vTextOffset : 0; // draw line if (annotationStyle.uiHint === 'horizontal-line' || annotationStyle.uiHint === 'vertical-line') { if (annotationStyle.uiHint === 'horizontal-line') { xFrac = hasval(annotationStyle.align) ? annotationStyle.align : 1; yFrac = dataAxis.vFrac(annotation.y); xys[0] = 0; xys[1] = yFrac; xys[2] = 1; xys[3] = yFrac; } else if (annotationStyle.uiHint === 'vertical-line') { xFrac = timeAxis.tFrac(annotation.time_PMILLIS); yFrac = hasval(annotationStyle.align) ? annotationStyle.align : 1; xys[0] = xFrac; xys[1] = 0; xys[2] = xFrac; xys[3] = 1; } program.use(gl); u_Color.setData(gl, color); xysBuffer.setData(xys.subarray(0, 4)); a_Position.setDataAndEnable(gl, xysBuffer, 2, GL.FLOAT); gl.drawArrays(GL.LINES, 0, 2); program.endUse(gl); } else { xFrac = timeAxis.tFrac(annotation.time_PMILLIS); yFrac = dataAxis.vFrac(annotation.y); } textureRenderer.begin(gl, viewport); // draw icons for (let n = 0; n < annotationStyle.numIcons; n++) { const icon = annotationStyle.icon(n); const xFracOffset = xFrac + (hasval(icon.hOffset) ? icon.hOffset : 0) / viewport.w; const yFracOffset = yFrac + (hasval(icon.vOffset) ? icon.vOffset : 0) / viewport.h; const iconTexture = ui.loadImage(icon.url, function () { drawable.redraw(); }); if (iconTexture) { const options = { xAnchor: (hasval(icon.hAlign) ? icon.hAlign : 0.5), yAnchor: (hasval(icon.hAlign) ? icon.hAlign : 0.5), width: icon.displayWidth, height: icon.displayHeight, rotation_CCWRAD: 0 }; textureRenderer.draw(gl, iconTexture, xFracOffset, yFracOffset, options); } } // draw text label if (hasval(annotation.label)) { const textTexture = textTextures.value(font, color.rgbaString, annotation.label, bgColorString, bgPadding.toString(), bgBorderRadius.toString()); const xFracOffset = xFrac + hTextOffset / viewport.w; const yFracOffset = yFrac + vTextOffset / viewport.h; const xAnchor = hasval(annotationStyle.hTextAlign) ? annotationStyle.hTextAlign : 0; const yAnchor = textTexture.yAnchor(hasval(annotationStyle.vTextAlign) ? annotationStyle.vTextAlign : 0.5); textureRenderer.draw(gl, textTexture, xFracOffset, yFracOffset, { xAnchor: xAnchor, yAnchor: yAnchor }); } textureRenderer.end(gl); } textTextures.retainTouched(); }; }; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZWxpbmVfYW5ub3RhdGlvbl9wYWludGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3dlYmdsaW1wc2UvdGltZWxpbmUvdGltZWxpbmVfYW5ub3RhdGlvbl9wYWludGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQW1DQSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDL0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUM3QyxPQUFPLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDN0QsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGdCQUFnQixFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQzlELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUc3QyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRWpDLE1BQU0sVUFBVSxxQ0FBcUM7SUFDakQsa0JBQWtCO0lBQ2xCLE9BQU8sVUFBVSxRQUFrQixFQUFFLFFBQW9CLEVBQUUsUUFBZ0IsRUFBRSxLQUFvQixFQUFFLFFBQTBCLEVBQUUsRUFBYztRQUV6SSxNQUFNLFlBQVksR0FBRyxvQkFBb0IsRUFBRSxDQUFDO1FBQzVDLE1BQU0sZUFBZSxHQUFHLElBQUksZUFBZSxFQUFFLENBQUM7UUFFOUMsTUFBTSxPQUFPLEdBQUcsSUFBSSxPQUFPLENBQUMsaUJBQWlCLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztRQUNqRSxNQUFNLE9BQU8sR0FBRyxJQUFJLFlBQVksQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDckQsTUFBTSxVQUFVLEdBQUcsSUFBSSxTQUFTLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FB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LENBQUMsRUFBRSxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztpQkFDM0c7Z0JBRUQsZUFBZSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQzthQUMzQjtZQUVELFlBQVksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNqQyxDQUFDLENBQUM7SUFDTixDQUFDLENBQUM7QUFDTixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcclxuICogQ29weXJpZ2h0IChjKSAyMDE0LCBNZXRyb24sIEluYy5cclxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuICpcclxuICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbixcclxuICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxyXG4gKlxyXG4gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcclxuICogICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXHJcbiAqXHJcbiAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcclxuICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvblxyXG4gKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cclxuICpcclxuICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgY29weXJpZ2h0IGhvbGRlciBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnNcclxuICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXRcclxuICogICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxyXG4gKlxyXG4gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIiBBTkRcclxuICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRURcclxuICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRVxyXG4gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUlxyXG4gKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVNcclxuICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTO1xyXG4gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT05cclxuICogQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlRcclxuICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVNcclxuICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXHJcbiAqL1xyXG5pbXBvcnQgeyBUaW1lbGluZVRpbWVzZXJpZXNQYWludGVyRmFjdG9yeSB9IGZyb20gJy4vdGltZWxpbmVfdGltZXNlcmllc19yb3cnO1xyXG5pbXBvcnQgeyBEcmF3YWJsZSwgUGFpbnRlciB9IGZyb20gJy4uL2NvcmUnO1xyXG5pbXBvcnQgeyBUaW1lQXhpczFEIH0gZnJvbSAnLi90aW1lX2F4aXMnO1xyXG5pbXBvcnQgeyBBeGlzMUQgfSBmcm9tICcuLi9wbG90L2F4aXMnO1xyXG5pbXBvcnQgeyBUaW1lbGluZU1vZGVsLCBUaW1lbGluZVJvd01vZGVsLCBUaW1lbGluZUFubm90YXRpb25Nb2RlbCB9IGZyb20gJy4vdGltZWxpbmVfbW9kZWwnO1xyXG5pbXBvcnQgeyBUaW1lbGluZVVpIH0gZnJvbSAnLi90aW1lbGluZV91aSc7XHJcbmltcG9ydCB7IG5ld1RleHRUZXh0dXJlQ2FjaGU2IH0gZnJvbSAnLi4vdGV4dCc7XHJcbmltcG9ydCB7IFRleHR1cmVSZW5kZXJlciB9IGZyb20gJy4uL3RleHR1cmUnO1xyXG5pbXBvcnQgeyBQcm9ncmFtLCBVbmlmb3JtQ29sb3IsIEF0dHJpYnV0ZSB9IGZyb20gJy4uL3NoYWRlcic7XHJcbmltcG9ydCB7IHh5RnJhY19WRVJUU0hBREVSLCBzb2xpZF9GUkFHU0hBREVSIH0gZnJvbSAnLi4vbWlzYyc7XHJcbmltcG9ydCB7IGVuc3VyZUNhcGFjaXR5RmxvYXQzMiwgR0wsIGhhc3ZhbCB9IGZyb20gJy4uL3V0aWwvdXRpbCc7XHJcbmltcG9ydCB7IG5ld0R5bmFtaWNCdWZmZXIgfSBmcm9tICcuLi9idWZmZXInO1xyXG5pbXBvcnQgeyBCb3VuZHNVbm1vZGlmaWFibGUgfSBmcm9tICcuLi9ib3VuZHMnO1xyXG5pbXBvcnQgeyBUaW1lbGluZUFubm90YXRpb25TdHlsZVVpLCBUaW1lbGluZUFubm90YXRpb25JY29uIH0gZnJvbSAnLi90aW1lbGluZV9hbm5vdGF0aW9uX3N0eWxlJztcclxuaW1wb3J0IHsgd2hpdGUgfSBmcm9tICcuLi9jb2xvcic7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gbmV3VGltZXNlcmllc0Fubm90YXRpb25QYWludGVyRmFjdG9yeSgpOiBUaW1lbGluZVRpbWVzZXJpZXNQYWludGVyRmFjdG9yeSB7XHJcbiAgICAvLyBQYWludGVyIEZhY3RvcnlcclxuICAgIHJldHVybiBmdW5jdGlvbiAoZHJhd2FibGU6IERyYXdhYmxlLCB0aW1lQXhpczogVGltZUF4aXMxRCwgZGF0YUF4aXM6IEF4aXMxRCwgbW9kZWw6IFRpbWVsaW5lTW9kZWwsIHJvd01vZGVsOiBUaW1lbGluZVJvd01vZGVsLCB1aTogVGltZWxpbmVVaSk6IFBhaW50ZXIge1xyXG5cclxuICAgICAgICBjb25zdCB0ZXh0VGV4dHVyZXMgPSBuZXdUZXh0VGV4dHVyZUNhY2hlNigpO1xyXG4gICAgICAgIGNvbnN0IHRleHR1cmVSZW5kZXJlciA9IG5ldyBUZXh0dXJlUmVuZGVyZXIoKTtcclxuXHJcbiAgICAgICAgY29uc3QgcHJvZ3JhbSA9IG5ldyBQcm9ncmFtKHh5RnJhY19WRVJUU0hBREVSLCBzb2xpZF9GUkFHU0hBREVSKTtcclxuICAgICAgICBjb25zdCB1X0NvbG9yID0gbmV3IFVuaWZvcm1Db2xvcihwcm9ncmFtLCAndV9Db2xvcicpO1xyXG4gICAgICAgIGNvbnN0IGFfUG9zaXRpb24gPSBuZXcgQXR0cmlidXRlKHByb2dyYW0sICdhX1h5RnJhYycpO1xyXG5cclxuICAgICAgICBsZXQgeHlzID0gbmV3IEZsb2F0MzJBcnJheSgwKTtcclxuICAgICAgICB4eXMgPSBlbnN1cmVDYXBhY2l0eUZsb2F0MzIoeHlzLCA0KTtcclxuICAgICAgICBjb25zdCB4eXNCdWZmZXIgPSBuZXdEeW5hbWljQnVmZmVyKCk7XHJcblxyXG4gICAgICAgIC8vIFBhaW50ZXJcclxuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQsIHZpZXdwb3J0OiBCb3VuZHNVbm1vZGlmaWFibGUpIHtcclxuICAgICAgICAgICAgZ2wuYmxlbmRGdW5jU2VwYXJhdGUoR0wuU1JDX0FMUEhBLCBHTC5PTkVfTUlOVVNfU1JDX0FMUEhBLCBHTC5PTkUsIEdMLk9ORV9NSU5VU19TUkNfQUxQSEEpO1xyXG4gICAgICAgICAgICBnbC5lbmFibGUoR0wuQkxFTkQpO1xyXG5cclxuICAgICAgICAgICAgdGV4dFRleHR1cmVzLnJlc2V0VG91Y2hlcygpO1xyXG5cclxuICAgICAgICAgICAgbGV0IHhGcmFjID0gMDtcclxuICAgICAgICAgICAgbGV0IHlGcmFjID0gMDtcclxuXHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm93TW9kZWwuYW5ub3RhdGlvbkd1aWRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBhbm5vdGF0aW9uR3VpZDogc3RyaW5nID0gcm93TW9kZWwuYW5ub3RhdGlvbkd1aWRzLnZhbHVlQXQoaSk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBhbm5vdGF0aW9uOiBUaW1lbGluZUFubm90YXRpb25Nb2RlbCA9IG1vZGVsLmFubm90YXRpb24oYW5ub3RhdGlvbkd1aWQpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYW5ub3RhdGlvblN0eWxlOiBUaW1lbGluZUFubm90YXRpb25TdHlsZVVpID0gdWkuYW5ub3RhdGlvblN0eWxlKGFubm90YXRpb24uc3R5bGVHdWlkKTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBmb250ID0gaGFzdmFsKGFubm90YXRpb25TdHlsZS5mb250KSA/IGFubm90YXRpb25TdHlsZS5mb250IDogJzExcHggdmVyZGFuYSxzYW5zLXNlcmlmJztcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbG9yID0gaGFzdmFsKGFubm90YXRpb25TdHlsZS5jb2xvcikgPyBhbm5vdGF0aW9uU3R5bGUuY29sb3IgOiB3aGl0ZTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGJnQ29sb3JTdHJpbmcgPSBoYXN2YWwoYW5ub3RhdGlvblN0eWxlLmJnQ29sb3IpID8gYW5ub3RhdGlvblN0eWxlLmJnQ29sb3IucmdiYVN0cmluZyA6ICcjZmZmZmZmMDAnO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYmdQYWRkaW5nID0gaGFzdmFsKGFubm90YXRpb25TdHlsZS5iZ1BhZGRpbmcpID8gYW5ub3RhdGlvblN0eWxlLmJnUGFkZGluZyA6IDA7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBiZ0JvcmRlclJhZGl1cyA9IGhhc3ZhbChhbm5vdGF0aW9uU3R5bGUuYmdCb3JkZXJSYWRpdXMpID8gYW5ub3RhdGlvblN0eWxlLmJnQm9yZGVyUmFkaXVzIDogMDtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBoVGV4dE9mZnNldCA9IGhhc3ZhbChhbm5vdGF0aW9uU3R5bGUuaFRleHRPZmZzZXQpID8gYW5ub3RhdGlvblN0eWxlLmhUZXh0T2Zmc2V0IDogMDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHZUZXh0T2Zmc2V0ID0gaGFzdmFsKGFubm90YXRpb25TdHlsZS52VGV4dE9mZnNldCkgPyBhbm5vdGF0aW9uU3R5bGUudlRleHRPZmZzZXQgOiAwO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIGRyYXcgbGluZVxyXG4gICAgICAgICAgICAgICAgaWYgKGFubm90YXRpb25TdHlsZS51aUhpbnQgPT09ICdob3Jpem9udGFsLWxpbmUnIHx8IGFubm90YXRpb25TdHlsZS51aUhpbnQgPT09ICd2ZXJ0aWNhbC1saW5lJykge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoYW5ub3RhdGlvblN0eWxlLnVpSGludCA9PT0gJ2hvcml6b250YWwtbGluZScpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgeEZyYWMgPSBoYXN2YWwoYW5ub3RhdGlvblN0eWxlLmFsaWduKSA/IGFubm90YXRpb25TdHlsZS5hbGlnbiA6IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHlGcmFjID0gZGF0YUF4aXMudkZyYWMoYW5ub3RhdGlvbi55KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHh5c1swXSA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHh5c1sxXSA9IHlGcmFjO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB4eXNbMl0gPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB4eXNbM10gPSB5RnJhYztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYW5ub3RhdGlvblN0eWxlLnVpSGludCA9PT0gJ3ZlcnRpY2FsLWxpbmUnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHhGcmFjID0gdGltZUF4aXMudEZyYWMoYW5ub3RhdGlvbi50aW1lX1BNSUxMSVMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB5RnJhYyA9IGhhc3ZhbChhbm5vdGF0aW9uU3R5bGUuYWxpZ24pID8gYW5ub3RhdGlvblN0eWxlLmFsaWduIDogMTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHh5c1swXSA9IHhGcmFjO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB4eXNbMV0gPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB4eXNbMl0gPSB4RnJhYztcclxuICAgICAgICAgICAgICAgICAgICAgICAgeHlzWzNdID0gMTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHByb2dyYW0udXNlKGdsKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdV9Db2xvci5zZXREYXRhKGdsLCBjb2xvcik7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHh5c0J1ZmZlci5zZXREYXRhKHh5cy5zdWJhcnJheSgwLCA0KSk7XHJcbiAgICAgICAgICAgICAgICAgICAgYV9Qb3NpdGlvbi5zZXREYXRhQW5kRW5hYmxlKGdsLCB4eXNCdWZmZXIsIDIsIEdMLkZMT0FUKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgZ2wuZHJhd0FycmF5cyhHTC5MSU5FUywgMCwgMik7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHByb2dyYW0uZW5kVXNlKGdsKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHhGcmFjID0gdGltZUF4aXMudEZyYWMoYW5ub3RhdGlvbi50aW1lX1BNSUxMSVMpO1xyXG4gICAgICAgICAgICAgICAgICAgIHlGcmFjID0gZGF0YUF4aXMudkZyYWMoYW5ub3RhdGlvbi55KTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB0ZXh0dXJlUmVuZGVyZXIuYmVnaW4oZ2wsIHZpZXdwb3J0KTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBkcmF3IGljb25zXHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBuID0gMDsgbiA8IGFubm90YXRpb25TdHlsZS5udW1JY29uczsgbisrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaWNvbjogVGltZWxpbmVBbm5vdGF0aW9uSWNvbiA9IGFubm90YXRpb25TdHlsZS5pY29uKG4pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB4RnJhY09mZnNldCA9IHhGcmFjICsgKGhhc3ZhbChpY29uLmhPZmZzZXQpID8gaWNvbi5oT2Zmc2V0IDogMCkgLyB2aWV3cG9ydC53O1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHlGcmFjT2Zmc2V0ID0geUZyYWMgKyAoaGFzdmFsKGljb24udk9mZnNldCkgPyBpY29uLnZPZmZzZXQgOiAwKSAvIHZpZXdwb3J0Lmg7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGljb25UZXh0dXJlID0gdWkubG9hZEltYWdlKGljb24udXJsLCBmdW5jdGlvbiAoKSB7IGRyYXdhYmxlLnJlZHJhdygpOyB9KTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaWNvblRleHR1cmUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhBbmNob3I6IChoYXN2YWwoaWNvbi5oQWxpZ24pID8gaWNvbi5oQWxpZ24gOiAwLjUpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeUFuY2hvcjogKGhhc3ZhbChpY29uLmhBbGlnbikgPyBpY29uLmhBbGlnbiA6IDAuNSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogaWNvbi5kaXNwbGF5V2lkdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IGljb24uZGlzcGxheUhlaWdodCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdGF0aW9uX0NDV1JBRDogMFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dHVyZVJlbmRlcmVyLmRyYXcoZ2wsIGljb25UZXh0dXJlLCB4RnJhY09mZnNldCwgeUZyYWNPZmZzZXQsIG9wdGlvbnMpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvLyBkcmF3IHRleHQgbGFiZWxcclxuICAgICAgICAgICAgICAgIGlmIChoYXN2YWwoYW5ub3RhdGlvbi5sYWJlbCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZXh0VGV4dHVyZSA9IHRleHRUZXh0dXJlcy52YWx1ZShcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9udCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IucmdiYVN0cmluZyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbi5sYWJlbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgYmdDb2xvclN0cmluZyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgYmdQYWRkaW5nLnRvU3RyaW5nKCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJnQm9yZGVyUmFkaXVzLnRvU3RyaW5nKClcclxuICAgICAgICAgICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB4RnJhY09mZnNldCA9IHhGcmFjICsgaFRleHRPZmZzZXQgLyB2aWV3cG9ydC53O1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHlGcmFjT2Zmc2V0ID0geUZyYWMgKyB2VGV4dE9mZnNldCAvIHZpZXdwb3J0Lmg7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHhBbmNob3IgPSBoYXN2YWwoYW5ub3RhdGlvblN0eWxlLmhUZXh0QWxpZ24pID8gYW5ub3RhdGlvblN0eWxlLmhUZXh0QWxpZ24gOiAwO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHlBbmNob3IgPSB0ZXh0VGV4dHVyZS55QW5jaG9yKGhhc3ZhbChhbm5vdGF0aW9uU3R5bGUudlRleHRBbGlnbikgPyBhbm5vdGF0aW9uU3R5bGUudlRleHRBbGlnbiA6IDAuNSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHRleHR1cmVSZW5kZXJlci5kcmF3KGdsLCB0ZXh0VGV4dHVyZSwgeEZyYWNPZmZzZXQsIHlGcmFjT2Zmc2V0LCB7IHhBbmNob3I6IHhBbmNob3IsIHlBbmNob3I6IHlBbmNob3IgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgdGV4dHVyZVJlbmRlcmVyLmVuZChnbCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRleHRUZXh0dXJlcy5yZXRhaW5Ub3VjaGVkKCk7XHJcbiAgICAgICAgfTtcclxuICAgIH07XHJcbn1cclxuIl19