{
  "TypeId": "ScriptDemosaicingAlgorithm",
  "Version": 1,
  "Id": "f097fb00-a4c8-441c-a106-414856247695",
  "DisplayName": "Bilinear - JS",
  "SupportedBayerPatterns": [
    "BGGR_2x2",
    "GBRG_2x2",
    "GRBG_2x2",
    "RGGB_2x2",
    "BGGR_4x4",
    "GBRG_4x4",
    "GRBG_4x4",
    "RGGB_4x4"
  ],
  "IsDedicatedOutputBufferNeeded": false,
  "DemosaicingScript": {
    "Language": "JavaScript",
    "Source": "Ly8gcHJlcGFyZSB0aGUgcmVzdWx0IHRvIHJlcG9ydCwgYW5kIGZhaWwgZWFybHkgaWYgdGhlIHR5cGUgaXMgbm90IGJvdW5kCnZhciByZXN1bHQgPSBEZW1vc2FpY2luZ1Jlc3VsdC5kZWZhdWx0OwoKLy8gY2hlY2sgdGhlIGZvcm1hdCBvZiB0aGUgYnVmZmVycywgdGhpcyBzY3JpcHQgcmVhZHMgYW5kIHdyaXRlcyAxNi1iaXQgY29sb3IgY2hhbm5lbHMgb25seQppZiAoY29udGV4dC5mb3JtYXQgIT09IEJpdG1hcEZvcm1hdC5iZ3JhNjQpCiAgICB0aHJvdyBuZXcgRXJyb3IoIk9ubHkgNjQtYml0IEJHUkEgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgc2NyaXB0LiIpOwoKLy8gaW50ZXJwb2xhdGUgb25lIG1vc2FpYywgd2hpY2ggaXMgdGhlIGltYWdlIGl0c2VsZiB3aGVuIGl0cyBwYXR0ZXJuIGlzIDJ4MiBhbmQgb25lIG9mIHRoZSA0IHBoYXNlcyBvZiB0aGUgaW1hZ2Ugd2hlbiBpdCBpcyA0eDQKZnVuY3Rpb24gaW50ZXJwb2xhdGVNb3NhaWMobW9zYWljKSB7CiAgICAvLyBjb3B5IHRoZSBjb2xvciBwYXR0ZXJuIGludG8gcGxhaW4gYXJyYXlzLCB0aGUgdmFsdWUgb2YgZWFjaCBjb21wb25lbnQgaXMgdGhlIG9mZnNldCBvZiBpdHMgY2hhbm5lbCBpbiBhIEJHUkEgcGl4ZWwKICAgIHZhciBjb2xvclBhdHRlcm4gPSBtb3NhaWMuY29sb3JQYXR0ZXJuOwogICAgaWYgKGNvbG9yUGF0dGVybi5sZW5ndGggIT09IDIgfHwgY29sb3JQYXR0ZXJuWzBdLmxlbmd0aCAhPT0gMikKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIk9ubHkgMngyIHBhdHRlcm5zIG9mIEJheWVyIEZpbHRlciBhcmUgc3VwcG9ydGVkIGJ5IHRoaXMgc2NyaXB0LiIpOwogICAgdmFyIHBhdHRlcm4gPSBbCiAgICAgICAgWyBjb2xvclBhdHRlcm5bMF1bMF0sIGNvbG9yUGF0dGVyblswXVsxXSBdLAogICAgICAgIFsgY29sb3JQYXR0ZXJuWzFdWzBdLCBjb2xvclBhdHRlcm5bMV1bMV0gXQogICAgXTsKCiAgICAvLyBwcmVwYXJlIHRoZSBnZW9tZXRyeSBhbmQgdGhlIHN0cmVhbXMsIHdoaWNoIGJlbG9uZyB0byB0aGlzIG1vc2FpYyBhbmQgbm90IHRvIHRoZSBpbWFnZQogICAgdmFyIHdpZHRoID0gbW9zYWljLndpZHRoOwogICAgdmFyIGhlaWdodCA9IG1vc2FpYy5oZWlnaHQ7CiAgICB2YXIgbGFzdFggPSB3aWR0aCAtIDE7CiAgICB2YXIgY29tcG9uZW50Q291bnQgPSB3aWR0aCAqIDQ7CiAgICB2YXIgaW5wdXRTdHJlYW0gPSBtb3NhaWMuaW5wdXRTdHJlYW07CiAgICB2YXIgb3V0cHV0U3RyZWFtID0gbW9zYWljLm91dHB1dFN0cmVhbTsKICAgIGlucHV0U3RyZWFtLnBvc2l0aW9uID0gMDsKICAgIG91dHB1dFN0cmVhbS5wb3NpdGlvbiA9IDA7CgogICAgLy8gcHJlcGFyZSB0aGUgYnVmZmVycywgdGhlIGFycmF5cyBjcmVhdGVkIGJ5IHRoZSBjb250ZXh0IGFyZSBDTFIgYXJyYXlzIHdoaWNoIHRoZSBidWxrIGhlbHBlcnMgZmlsbCBhbmQgd3JpdGUgZGlyZWN0bHkKICAgIHZhciBpbnB1dEJ1ZmZlciA9IGNvbnRleHQuY3JlYXRlVUludDE2QXJyYXkoY29tcG9uZW50Q291bnQpOwogICAgdmFyIG91dHB1dEJ1ZmZlciA9IGNvbnRleHQuY3JlYXRlVUludDE2QXJyYXkoY29tcG9uZW50Q291bnQpOwogICAgdmFyIGFib3ZlID0gbmV3IEFycmF5KHdpZHRoKTsKICAgIHZhciBjdXJyZW50ID0gbmV3IEFycmF5KHdpZHRoKTsKICAgIHZhciBiZWxvdyA9IG5ldyBBcnJheSh3aWR0aCk7CgogICAgLy8gcmVhZCBvbmUgcm93IG9mIHRoZSBtb3NhaWMgYW5kIGtlZXAgdGhlIHNpbmdsZSBkZWZpbmVkIGNvbG9yIGNoYW5uZWwgb2YgZWFjaCBvZiBpdHMgcGl4ZWxzCiAgICBmdW5jdGlvbiByZWFkTW9zYWljUm93KHksIHNhbXBsZXMpIHsKICAgICAgICBpbnB1dFN0cmVhbS5yZWFkVUludDE2RXhhY3QoaW5wdXRCdWZmZXIsIDAsIGNvbXBvbmVudENvdW50KTsKICAgICAgICB2YXIgY29tcG9uZW50cyA9IHBhdHRlcm5beSAmIDFdOwogICAgICAgIGZvciAodmFyIHggPSAwOyB4IDwgd2lkdGg7ICsreCkKICAgICAgICAgICAgc2FtcGxlc1t4XSA9IGlucHV0QnVmZmVyW3ggKiA0ICsgY29tcG9uZW50c1t4ICYgMV1dOwogICAgfQoKICAgIC8vIGNvcHkgdGhlIHNhbXBsZXMgb2YgYSByb3csIHdoaWNoIGlzIGhvdyB0aGUgdG9wIGFuZCBib3R0b20gYm9yZGVycyBhcmUgZXh0ZW5kZWQKICAgIGZ1bmN0aW9uIGNvcHlSb3coc291cmNlLCBkZXN0aW5hdGlvbikgewogICAgICAgIGZvciAodmFyIHggPSAwOyB4IDwgd2lkdGg7ICsreCkKICAgICAgICAgICAgZGVzdGluYXRpb25beF0gPSBzb3VyY2VbeF07CiAgICB9CgogICAgLy8gcHJpbWUgdGhlIHdpbmRvdyB3aXRoIHRoZSBmaXJzdCByb3csIHRoZSByb3cgYWJvdmUgaXQgaXMgdGhlIHJvdyBpdHNlbGYKICAgIHJlYWRNb3NhaWNSb3coMCwgY3VycmVudCk7CiAgICBjb3B5Um93KGN1cnJlbnQsIGFib3ZlKTsKCiAgICAvLyBpbnRlcnBvbGF0ZSB0aGUgbW9zYWljIHJvdyBieSByb3csIGtlZXBpbmcgb25seSB0aGUgMyByb3dzIHdoaWNoIHRoZSAzeDMgd2luZG93IG5lZWRzCiAgICBmb3IgKHZhciB5ID0gMDsgeSA8IGhlaWdodDsgKyt5KSB7CiAgICAgICAgLy8gc3RvcCBhcyBlYXJseSBhcyBwb3NzaWJsZSBpZiB0aGUgcmVuZGVyaW5nIGhhcyBiZWVuIGNhbmNlbGxlZAogICAgICAgIGlmIChpc0NhbmNlbGxhdGlvblJlcXVlc3RlZCgpKQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CgogICAgICAgIC8vIHJlYWQgdGhlIHJvdyBiZWxvdywgb3IgZXh0ZW5kIHRoZSBib3R0b20gYm9yZGVyIGJ5IHRoZSBsYXN0IHJvdwogICAgICAgIGlmICh5IDwgaGVpZ2h0IC0gMSkKICAgICAgICAgICAgcmVhZE1vc2FpY1Jvdyh5ICsgMSwgYmVsb3cpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgY29weVJvdyhjdXJyZW50LCBiZWxvdyk7CgogICAgICAgIC8vIHNlbGVjdCB0aGUgY29tcG9uZW50cyBwcm92aWRlZCBieSB0aGUgcGl4ZWxzIG9mIHRoaXMgcm93IGFuZCBieSB0aGUgcGl4ZWxzIG9mIHRoZSByb3dzIGJlc2lkZSBpdAogICAgICAgIHZhciByb3dDb21wb25lbnRzID0gcGF0dGVyblt5ICYgMV07CiAgICAgICAgdmFyIG5laWdoYm9yQ29tcG9uZW50cyA9IHBhdHRlcm5bKHkgKyAxKSAmIDFdOwoKICAgICAgICAvLyBpbnRlcnBvbGF0ZSBldmVyeSBwaXhlbCBvZiB0aGUgcm93CiAgICAgICAgZm9yICh2YXIgeCA9IDA7IHggPCB3aWR0aDsgKyt4KSB7CiAgICAgICAgICAgIHZhciBwYXJpdHkgPSB4ICYgMTsKICAgICAgICAgICAgdmFyIG93bkNvbXBvbmVudCA9IHJvd0NvbXBvbmVudHNbcGFyaXR5XTsKICAgICAgICAgICAgdmFyIGhvcml6b250YWxDb21wb25lbnQgPSByb3dDb21wb25lbnRzWzEgLSBwYXJpdHldOwogICAgICAgICAgICB2YXIgdmVydGljYWxDb21wb25lbnQgPSBuZWlnaGJvckNvbXBvbmVudHNbcGFyaXR5XTsKICAgICAgICAgICAgdmFyIGRpYWdvbmFsQ29tcG9uZW50ID0gbmVpZ2hib3JDb21wb25lbnRzWzEgLSBwYXJpdHldOwogICAgICAgICAgICB2YXIgbGVmdCA9IHggPiAwID8geCAtIDEgOiAwOwogICAgICAgICAgICB2YXIgcmlnaHQgPSB4IDwgbGFzdFggPyB4ICsgMSA6IGxhc3RYOwogICAgICAgICAgICB2YXIgb2Zmc2V0ID0geCAqIDQ7CiAgICAgICAgICAgIG91dHB1dEJ1ZmZlcltvZmZzZXQgKyBvd25Db21wb25lbnRdID0gY3VycmVudFt4XTsKICAgICAgICAgICAgaWYgKGhvcml6b250YWxDb21wb25lbnQgPT09IHZlcnRpY2FsQ29tcG9uZW50KSB7CiAgICAgICAgICAgICAgICAvLyBhIHJlZCBvciBibHVlIHBpeGVsLCBncmVlbiBjb21lcyBmcm9tIHRoZSA0IHBpeGVscyBiZXNpZGUgaXQgYW5kIHRoZSByZW1haW5pbmcgY29tcG9uZW50IGZyb20gdGhlIDQgZGlhZ29uYWwgb25lcwogICAgICAgICAgICAgICAgb3V0cHV0QnVmZmVyW29mZnNldCArIGhvcml6b250YWxDb21wb25lbnRdID0gKGN1cnJlbnRbbGVmdF0gKyBjdXJyZW50W3JpZ2h0XSArIGFib3ZlW3hdICsgYmVsb3dbeF0pID4\u002BIDI7CiAgICAgICAgICAgICAgICBvdXRwdXRCdWZmZXJbb2Zmc2V0ICsgZGlhZ29uYWxDb21wb25lbnRdID0gKGFib3ZlW2xlZnRdICsgYWJvdmVbcmlnaHRdICsgYmVsb3dbbGVmdF0gKyBiZWxvd1tyaWdodF0pID4\u002BIDI7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAvLyBhIGdyZWVuIHBpeGVsLCB0aGUgMiByZW1haW5pbmcgY29tcG9uZW50cyBjb21lIGZyb20gdGhlIHBpeGVscyBiZXNpZGUgaXQgYW5kIGZyb20gdGhlIHBpeGVscyBhYm92ZSBhbmQgYmVsb3cgaXQKICAgICAgICAgICAgICAgIG91dHB1dEJ1ZmZlcltvZmZzZXQgKyBob3Jpem9udGFsQ29tcG9uZW50XSA9IChjdXJyZW50W2xlZnRdICsgY3VycmVudFtyaWdodF0pID4\u002BIDE7CiAgICAgICAgICAgICAgICBvdXRwdXRCdWZmZXJbb2Zmc2V0ICsgdmVydGljYWxDb21wb25lbnRdID0gKGFib3ZlW3hdICsgYmVsb3dbeF0pID4\u002BIDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgb3V0cHV0QnVmZmVyW29mZnNldCArIDNdID0gNjU1MzU7CiAgICAgICAgfQoKICAgICAgICAvLyB3cml0ZSB0aGUgaW50ZXJwb2xhdGVkIHJvdyBhbmQgbW92ZSB0aGUgd2luZG93IGRvd24sIHJldXNpbmcgdGhlIHJvdyB3aGljaCBoYXMganVzdCBsZWZ0IGl0CiAgICAgICAgb3V0cHV0U3RyZWFtLndyaXRlVUludDE2KG91dHB1dEJ1ZmZlciwgMCwgY29tcG9uZW50Q291bnQpOwogICAgICAgIHZhciByZXVzZWQgPSBhYm92ZTsKICAgICAgICBhYm92ZSA9IGN1cnJlbnQ7CiAgICAgICAgY3VycmVudCA9IGJlbG93OwogICAgICAgIGJlbG93ID0gcmV1c2VkOwogICAgfQoKICAgIC8vIHJlcG9ydCB0aGF0IHRoZSB3aG9sZSBtb3NhaWMgaGFzIGJlZW4gaW50ZXJwb2xhdGVkCiAgICByZXR1cm4gdHJ1ZTsKfQoKLy8gaW50ZXJwb2xhdGUgdGhlIHN1YiBtb3NhaWNzIG9uZSBieSBvbmUsIGEgMngyIG1vc2FpYyBpcyBoYW5kZWQgb3V0IG9uY2UgYXMgdGhlIG9ubHkgb25lIGFuZCBhIDR4NCBtb3NhaWMgYXMgdGhlIDQgMngyIG1vc2FpY3MgaXRzIHBoYXNlcyBjYXJyeQp2YXIgc3ViTW9zYWljID0gY29udGV4dC5zZWxlY3ROZXh0U3ViTW9zYWljKCk7CndoaWxlIChzdWJNb3NhaWMpIHsKICAgIGlmICghaW50ZXJwb2xhdGVNb3NhaWMoc3ViTW9zYWljKSkKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgc3ViTW9zYWljID0gY29udGV4dC5zZWxlY3ROZXh0U3ViTW9zYWljKCk7Cn0KCnJldHVybiByZXN1bHQ7Cg=="
  }
}